ファイルを一度読み込んで、各行をファイルに書き込むのが最善です。したがって、AWKを使用した@steveによるソリューションは良いものです。
この問題grep
は、適切な正規表現を使用して解決できます。年の位置にある^.......2010
行のみに一致します。2010
次に、シェル スクリプトが何年にもわたってループし、次のgrep
ように実行し続けることができます。
for year in 2010 2011 2012; do
grep "^.......$year" datafile > $year.txt
done
しかし、1 年に 1 回ソース ファイル全体を読み取るため、エレガントではありません。
これは、AWK ソリューションに沿った Python ソリューションです。
import sys
def next_line():
if len(sys.argv) == 1:
for line in sys.stdin:
yield line
else:
for name in sys.argv[1:]:
with open(name) as f:
for line in f:
yield line
_open_files = {}
def output(fname, line):
if fname not in _open_files:
_open_files[fname] = open(fname, "w")
_open_files[fname].write(line)
for line in next_line():
year = line[7:11]
fname = year + ".txt"
output(fname, line)
AWK は確かに簡潔さで勝っています。各ファイルから順番にソース行を提供するサービスを提供する関数を実装するnext_line()
必要がありました。ファイルを指定しなかった場合は標準入力を提供する必要がありました。AWK を使用すると、無料で入手できます。ファイル名と文字列を指定して出力を書き込むだけの関数を実装するoutput()
必要がありましたが、AWK では無料で取得できます。
問題がこれ以上複雑にならない場合は、AWK ソリューションを使用できますが、時間が経つにつれてベルとホイッスルをさらに追加することが予想される場合は、Python ソリューションが効果を発揮する可能性があります。(だから、私は Python が大好きです... 一度動作するようになると、何をする必要があるとしても簡単に拡張できます。)