同じ最初の2文字で始まる行を抽出して別のファイルに出力するにはどうすればよいですか?

同じ最初の2文字で始まる行を抽出して別のファイルに出力するにはどうすればよいですか?

非常に大きなテキストのリストがあり、同じ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します。printf

変数をキャンセルして、後で式を直接使用できると思いますf。ただし、OpenBSDで使用される実装ではそうではありません(バグかもしれません)。substr()>awk


最初の2文字の異なる組み合わせが多すぎると、開いたファイルが多すぎて問題が発生する可能性があります。

次のバリエーションを使用すると、この問題は解決されます。

awk '{ f = substr($0,1,2) ".txt"; print >>f; close(f) }' file.in

おすすめ記事