将行提取到新文件

将行提取到新文件

假设我有一个大型 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

相关内容