非常に大きなテキストのリストがあり、同じ2文字で始まる行を抽出し、その2文字の名前を付けた別のファイルにその行を保存する方法が必要です。
例リスト:
abWEye7kgw7
abff34ZSrZf
abke8mzMyma
b2R5mPZGbCb
b2zhhCeLZzZ
b2q2T5rkACp
k9ekzbc8nUh
k9QzXBUrNT7
k92RtdXntZ3
vrTtR9GmbWG
vraVM9QXWzY
vrME9QnksBf
希望の出力:
ab* > ab.txt
b2* > b2.txt
k9* > k9.txt
vr* > vr.txt
リストはかなり大きく、最初の2文字の組み合わせがたくさんあります。
ベストアンサー1
$ awk '{ f = substr($0,1,2) ".txt"; print >f }' file.in
$ ls
ab.txt b2.txt file.in k9.txt vr.txt
$ cat ab.txt
abWEye7kgw7
abff34ZSrZf
abke8mzMyma
この問題は明らかにシェルでも解決できますが、awk
テキストファイルを解析するのに適しています。substr()
入力ファイルの各行で最初の2文字を選択し、最後に追加されたf
変数に割り当てます。現在の行を名前付きファイルに出力.txt
します。print
f
変数をキャンセルして、後で式を直接使用できると思いますf
。ただし、OpenBSDで使用される実装ではそうではありません(バグかもしれません)。substr()
>
awk
最初の2文字の異なる組み合わせが多すぎると、開いたファイルが多すぎて問題が発生する可能性があります。
次のバリエーションを使用すると、この問題は解決されます。
awk '{ f = substr($0,1,2) ".txt"; print >>f; close(f) }' file.in