cat

cat(1)

以下のようなファイル(input.txt)がある:

AAAAA
BBBBB
CCCCC
DDDDD
EEEEE

これに対して、ファイルを読み込み内容を出力するコマンドを作って欲しい。

実行結果:

$ python cat.py input.txt
AAAAA
BBBBB
CCCCC
DDDDD
EEEEE

コマンドライン引数として受け取ったファイルの内容を(何の変更も加えず)出力すれば良い。

どのように取りかかれば良いのか悩む場合には、以下の2つのステップに分割すると良い。 はじめに1.を片付け、そのあと2.に対応する。

  1. ひとつのファイルのみに対応したcatをつくる。
  2. 複数のファイルを渡した場合にも動作するcatを作る。

Note

コマンドライン引数の取扱いについて分からないことがあれば、sysモジュールの使い方(sys.argv)について学ぶと良い。 具体的には以下の動作をするコマンド(echoarg.py)が作れるようになると良い。:

$ python echoarg.py aa bb cc
> aa
> bb
> cc

cat(2)

catコマンドには”-n”オプションがある。これを有効にすると、出力結果が行番号と共に表示される。ひとつ前の課題で作ったコマンドにも行番号を一緒に表示する機能を加えたい。

今回は、引数の受け渡しをせずに”cat -n”と同様に行番号を付記して出力結果を返すコマンドが作成できれば良い。(空白などは揃える必要はない。)

実行結果:

$ python cat2.py input.txt
 1  AAAAA
 2  BBBBB
 3  CCCCC
 4  DDDDD
 5  EEEEE

cat(3)(すこし難しい)

この課題は少し難しいので面倒だったら飛ばしても良い。

作ったコマンドが引数をとれるようにする。catコマンドと同様に-nオプションを渡せるようにする。 対応するオプションは-nオプションだけで良い。

実行結果:

$ python cat3.py input.txt
AAAAA
BBBBB
CCCCC
DDDDD
EEEEE

$ python cat3.py -n input.txt
 1  AAAAA
 2  BBBBB
 3  CCCCC
 4  DDDDD
 5  EEEEE

Note

難しい理由は引数の解析のためには、ライブラリを使う必要があるから。

pythonでこのコマンドを実装しようとするときには以下の3つの方法が考えられる。

  • コマンドライン引数を自力で解析

    辛い。マゾい。(この問題を解くことに限定するのならばそれほど面倒でもないけれど)

  • optparseを使ってコマンドライン引数を解析

    古い方法

  • argparseを使ってコマンドライン引数を解析

    2.7以降から標準なのでこちらを使った方が良いかもしれない。

cat(4)

catは引数として渡されたファイル名の内容を出力する以外にも標準入力をパイプで受け取る機能を持っている。これに対応してほしい。

以下のようにして使えるように修正を加えて欲しい。:

$ python cat.py input.txt | tr ABCDE 12345 | python cat.py
11111
22222
33333
44444
55555