根据CSV文件的列值过滤行

时间:2019-09-29 15:02:45

标签: awk sed

我有一个包含1000行和10列的数据集。这是样本数据集

A,B,C,D,E,F,
a,b,c,d,e,f,
g,h,i,j,k,l,
m,n,o,p,q,r,
s,t,u,v,w,x,

从此数据集中,我要将列A的值为“ a”或“ m”的行复制到新的csv文件中。我也想复制标题。

我尝试使用awk。它复制了所有行,但没有复制标题。

awk '{$1~/a//m/ print}' inputfile.csv > outputfile.csv

如何将标头也复制到新的outputfile.csv中?

谢谢。

5 个答案:

答案 0 :(得分:2)

考虑到标题将位于第一行,请您试一试。

awk 'BEGIN{FS=OFS=","} FNR==1{print;next} $1 ~ /^a$|^m$/' Input_file > outputfile.csv

或根据Cyrus先生的评论添加以下内容:

awk 'BEGIN{FS=OFS=","} FNR==1{print;next} $1 ~ /^(a|m)$/' Input_file > outputfile.csv

或按照Ed先生的评论尝试以下操作:

awk -F, 'NR==1 || $1~/^[am]$/' Input_file > outputfile.csv

在OP的尝试中添加了更正:

  1. 在这里为所有行添加了FSOFS作为,,因为行是用逗号分隔的。
  2. 添加了FNR==1条件,这意味着它正在此处检查第一行并简单地打印它,因为我们要在输出文件中打印标题。它将打印第一行,然后next将跳过此处的所有其他语句。
  3. 使用更好的正则表达式来检查第一个字段的条件$1 ~ /^a$|^m$/

答案 1 :(得分:2)

这可能对您有用(GNU sed):

sed '1b;/^[am],/!d' oldFile >newFile

始终打印第一行,并删除所有未出现a,m,的行。

替代:

awk 'NR==1 || /^[am],/' oldFile >newFile

答案 2 :(得分:1)

awk。将字段分隔符(FS)设置为,并输出当前行(如果它是第一行或第一列包含am)。

awk 'NR==1 || $1=="a" || $1=="m"' FS=',' in.csv >out.csv

输出到out.csv:

A,B,C,D,E,F,
a,b,c,d,e,f,
m,n,o,p,q,r,

答案 3 :(得分:1)

$ awk -F, 'BEGIN{split("a,m",tmp); for (i in tmp) tgts[tmp[i]]} NR==1 || $1 in tgts' file
A,B,C,D,E,F,
a,b,c,d,e,f,
m,n,o,p,q,r,

答案 4 :(得分:-1)

awk的默认定界符似乎是空格。 Link

更改分隔符可以使用FS变量表示:

awk 'BEGIN { FS = "," } ; { print $2 }'