首页 > 解决方案 > 根据csv文件的列值过滤行

问题描述

我有一个包含 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 中?

提前致谢。

标签: awksed

解决方案


考虑到您的标题将位于第一行,您能否尝试以下操作。

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

或者根据赛勒斯先生的评论添加以下内容:

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

或者根据 Ed sir 的评论,尝试以下操作:

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

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

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

推荐阅读