awk 他のファイルの特定の列から同じ内容を持つすべての行を分離する方法

awk 他のファイルの特定の列から同じ内容を持つすべての行を分離する方法

次の大きな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

注意事項:

  1. 一部のawksでは、出力リダイレクトの右側の式の周りに括弧が必要です。
  2. 出力ファイルを閉じないと、一部のawksが失敗するため、12個以上の出力ファイルを取得すると、あまりにも多くの開いているファイルを保持しようとします。
  3. 許可されているすべてのawksで複数のオープン出力ファイルを維持することは非常に非効率的です
  4. すべてのawksでこの問題を解決するために、出力ファイルを1行ずつ閉じるのは非常に非効率的です。

おすすめ記事