次の大きなcsvファイル(Test.csv)があります。
1,2,3,A,5
1,2,3,B,5
1,2,3,E,5
1,2,3,D,5
1,2,3,Z,5
1,2,3,B,5
4番目の列の内容が異なるファイルの行を印刷したいと思います。実際、同じコンテンツを含むこれらの行を、4番目の列コンテンツという名前の新しいcsvファイルまたはtxtファイルに結合する必要があります。たとえば、
出力:
ファイルA
1,2,3,A,5
1,2,3,A,5
1,2,3,A,5
文書B
1,2,3,B,5
1,2,3,B,5
入力ファイルが大きいため、4番目の列にどれだけのパターンがあるのかわかりません。 4列には単語のみが含まれ、他の列には単語および/または数字が含まれます。
経験がなく、似たような質問を見つけて、次のコードも試してみました。
awk 'NR==FNR{a[$4]=NR; next} $NF in a {print > "outfile" a[$NF]}' Test.csv
しかし、何も動作しません。誰でも私を助けることができますか?よろしくお願いします。
ベストアンサー1
これは、POSIX シーケンスと awk を使用するすべての UNIX システムのすべてのシェルで効率的に動作します。
$ sort -t, -k4,4 test.csv |
awk -F, '$4!=prev{close(out); out="File"$4; prev=$4} {print > out}'
$ head -n 20 File*
==> FileA <==
1,2,3,A,5
==> FileB <==
1,2,3,B,5
1,2,3,B,5
==> FileD <==
1,2,3,D,5
==> FileE <==
1,2,3,E,5
==> FileZ <==
1,2,3,Z,5
注意事項:
- 一部のawksでは、出力リダイレクトの右側の式の周りに括弧が必要です。
- 出力ファイルを閉じないと、一部のawksが失敗するため、12個以上の出力ファイルを取得すると、あまりにも多くの開いているファイルを保持しようとします。
- 許可されているすべてのawksで複数のオープン出力ファイルを維持することは非常に非効率的です
- すべてのawksでこの問題を解決するために、出力ファイルを1行ずつ閉じるのは非常に非効率的です。