サイズが約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)
開いているファイルが多すぎる可能性があるため、ファイルを閉じてください(コメントを残してくれた@に感謝します)コスタス)