同じ最初の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

答え2

awk解決策:

awk -v FS='' '{ print > $1$2".txt" }' file

生成されたファイルの1つ:

$ cat k9.txt 
k9ekzbc8nUh
k9QzXBUrNT7
k92RtdXntZ3

答え3

この試み:

cat list.txt | while IFS= read -r st; do echo $st >> ${st:0:2}.txt; done

答え4

私は結果を得るために次の方法を使用します。テストがうまくいくかどうかテストしてください

 for j in `awk '{print substr($1,1,2)}' k.txt  | uniq -c | awk '$1 >=2 {print $2}'`; do sed -n "/^$j/p" k.txt > $j.txt; done

各行の最初の2文字を抽出します。 1行以上で最初の2文字が同じ場合。関連行を印刷し、ファイル名の最初の2文字にその行を保存します。

出力

 cat ab.txt
    abWEye7kgw7
    abff34ZSrZf
    abke8mzMyma

    cat b2.txt
    b2R5mPZGbCb
    b2zhhCeLZzZ
    b2q2T5rkACp

     cat k9.txt
    k9ekzbc8nUh
    k9QzXBUrNT7
    k92RtdXntZ3

 cat vr.txt
vrTtR9GmbWG
vraVM9QXWzY
vrME9QnksBf

関連情報