非常に大きなテキストのリストがあり、同じ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
答え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