假设我有一个大型 CSV 文件,其中包含标题和多个列。为了这个问题的目的,我将考虑一个只有两列的小文件。我们可以这样称呼它use_rep
。
user_id,rep
885,500K+
22565,200K+
7453,200K+
86440,100K+
116858,100K+
22222,100K+
38906,100K+
10762,<100K
70524,<100K
我想将每一行发送到与第二列上的值相对应的文件。例如,我希望有一个文件,其名称为200K+
,内容为
user_id,rep
22565,200K+
7453,200K+
use_rep
无论如何,不应假定的内容已被订购。理想情况下,要使用的模式接受正则表达式。
不首选 sed 或 perl。
答案1
忽略标题(您可以稍后添加):
awk -F, 'NR > 1 {print > $2}' use_rep
它将把每一行打印到由第二列命名的文件中:
~ 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