ヘッダーと複数の列を含む大きなCSVファイルがあるとします。この質問の目的のために、2つの列しかない小さなファイルを考えてみましょう。私たちはこれをこう呼ぶことができますuse_rep
。
user_id,rep
885,500K+
22565,200K+
7453,200K+
86440,100K+
116858,100K+
22222,100K+
38906,100K+
10762,<100K
70524,<100K
各行を2番目の列の値に対応するファイルに送信したいと思います。たとえば、次のような名前200K+
と内容を含むファイルがあります。
user_id,rep
22565,200K+
7453,200K+
use_rep
いずれにせよ、コンテンツが注文されたと仮定してはいけません。理想的には、使用したいパターンは正規表現を受け入れます。
sedやperlは推奨されません。
答え1
ヘッダーを無視します(後で追加できます)。
awk -F, 'NR > 1 {print > $2}' use_rep
2番目の列の名前付きファイルに各行を印刷します。
~ head *[0-9]*
==> 100K+ <==
86440,100K+
116858,100K+
22222,100K+
38906,100K+
==> 200K+ <==
22565,200K+
7453,200K+
==> 500K+ <==
885,500K+
==> <100K <==
10762,<100K
タイトルを指定するには、次のように表示できます。
awk -F, 'NR == 1 {header = $0; next} # save header, skip this line
!a[$2]++ { print header > $2 } # print if second field hasnt been seen before
{ print > $2 }' use_rep
結果:
~ head *[0-9]*
==> 100K+ <==
user_id,rep
86440,100K+
116858,100K+
22222,100K+
38906,100K+
==> 200K+ <==
user_id,rep
22565,200K+
7453,200K+
==> 500K+ <==
user_id,rep
885,500K+
==> <100K <==
user_id,rep
10762,<100K
70524,<100K
答え2
次のコマンドを試してください。素晴らしい作品。
注文する
for i in `awk -F "," '{print $2}' l.txt | sort | uniq`; do sed -n '/'$i'$/p' l.txt > $i.txt ; done