最初の列値に基づく単一の読み取りフィルタcsv

最初の列値に基づく単一の読み取りフィルタcsv

サイズが約1GBの巨大なcsvファイルがあります。 csvの最初の列には、約300個の固有の整数値が含まれています。 csvを一度処理し、一致する最初の列値に基づいて出力を別のファイルに保存したいと思います。

awk出力を列1の特定の値として保存するソリューションを知っています。

for i in $column1values; do
  awk -F, -v a=$i '$1 == a' input.csv > output-$i.csv
done

ただし、このソリューションでは、一致する列1の値を見つけようとするたびに、大きなcsvファイルを再読み込みします。大容量のcsvファイルを考慮すると、これは非効率的です。

それでは、csvファイルを一度だけ読みながらどのようにこれを達成できますか?

編集する:
元のCSVファイルにデータがあるとします。

1,r1c2,r1c3,r1c4
1,r2c2,r2c3,r2c4
2,r3c2,r3c3,r3c4
2,r4c2,r4c3,r4c4
3,r5c2,r5c3,r5c4
3,r6c2,r6c3,r6c4

たとえば、最初の列の値に基づいて出力をフィルタリングしたいとします。

出力1.csv:

1,r1c2,r1c3,r1c4
1,r2c2,r2c3,r2c4

出力2.csv

2,r3c2,r3c3,r3c4
2,r4c2,r4c3,r4c4

出力-3.csv

3,r5c2,r5c3,r5c4
3,r6c2,r6c3,r6c4

さらに重要なのは、元の大きなcsvファイルを一度だけ読みながら、このような出力をフィルタリングしたいということです。どうすればいいですか?

答え1

そしてawk

awk -F, '{f="output-"$1".csv"; print $0 >> f; close(f)}' file
  • -F,区切り記号をに設定します,
  • f="output-"$1".csv"書き込むファイル名を設定してください
  • print $0 >> fその行をファイルに追加しますf
  • close(f)開いているファイルが多すぎる可能性があるため、ファイルを閉じてください(コメントを残してくれた@に感謝します)コスタス)

関連情報