これは他の2つの質問の組み合わせです(1行にプレフィックスでファイルを分割する方法そしてヘッダーを含む列に基づいてファイルを分割する方法)。私は次のように始めたいと思いますinput.csv
:
id,first,second,third
1,a,b,c
333,b,b,b
1,d,e,f
2,d,e,f
1,c,d,e
333,a,a,a
[more lines in the same format]
この内容に1.csv
:
id,first,second,third
1,a,b,c
1,d,e,f
1,c,d,e
、このコンテンツは次の場所にあります2.csv
。
id,first,second,third
2,d,e,f
、この333.csv
:
id,first,second,third
333,b,b,b
333,a,a,a
、それは:
- すべてのIDを次に変更してください。窒素入力する
N.csv
。 - 行を順番に保持オリジナルのように。
- タイトルを含めるすべての出力ファイルの生ファイル。
これも非常に速くなければならないので、while read
ループは次のようになります。いいえ切ってしまいます。
ベストアンサー1
この GNU awk コマンドはこの問題を解決できます。
awk -F ',' 'NR==1{h=$0; next};!seen[$1]++{f=$1".csv"; print h > f};{f=$1".csv"; print >> f; close(f)}' input.csv
警告:最初のフィールドにエスケープされたカンマがあると機能しません。他の分野のカンマは正常に動作します。
説明する:
-F ','
(フィールド区切り文字)$1
などがスペースで区切られた値ではなくCSV列を参照していることを確認してください。NR==1{h=$0; next}
NR==1
ヘッダー行全体を変数h
()に保存し、その行()をスキップしてh=$0
最初の行()を特別に処理しますnext
。!seen[$1]++{f=$1".csv"; print h > f}
$1
特殊文字()が最初に発生した場合は、次の項目をfilename変数に保存し、ヘッダーを対応するファイル()に保存して処理します。!seen[$1]
$1
.csv
f
print h > f
{f=$1".csv"; print >> f; close(f)}
現在の行をファイルに追加し()、print >> f
ファイル記述子を閉じて(close(f)
)、特定のIDを持つすべての行が処理された後にその行が保持されないようにします。
ボーナス:別のフィールドに置き換えると、期待$1
どおりに機能するはずです。つまり、特定の列にその値を含む行を含むその列の各固有値のファイルを生成する必要があります。