【问题标题】:Filter file with awk and keep header in output使用 awk 过滤文件并将标题保留在输出中
【发布时间】:2016-10-26 11:00:57
【问题描述】:

我有以下 CSV 文件:

a,b,c,d
x,1,1,1
y,1,1,0
z,1,0,0

我想保留加起来超过 1 的行,所以我执行了这个 awk 命令:

awk -F "," 'NR > 1{s=0; for (i=2;i<=NF;i++) s+=$i; if (s>1)print}' file

并获得这个:

x,1,1,1
y,1,1,0

我怎样才能做同样的事情但保留第一行(标题)?

【问题讨论】:

标签: awk filter header


【解决方案1】:
$ awk -F "," 'NR==1; NR > 1{s=0; for (i=2;i<=NF;i++) s+=$i; if (s>1)print}' file
a,b,c,d
x,1,1,1
y,1,1,0

【讨论】:

  • 也可以使用awk -F, 'NR &gt; 1{s=0; for (i=2;i&lt;=NF;i++) s+=$i} s&gt;1 || NR==1' file
  • 不错的替代品@Sundeep,我想说的是更惯用的版本。
  • NR ==1 是什么意思。我理解 NR > 1 表示第一行不带函数。
  • @HKJ3,在发布的答案中,NR == 1; 表示对第一行执行默认操作。在这种情况下,它等同于NR == 1 { print }。换句话说,无论如何都要打印标题(第 1 行)。对于表头之后的所有行,按照给定的逻辑打印。
【解决方案2】:

因为只有 0 和 1:

$ awk 'NR==1 || gsub(/1/, "1") > 1' file
a,b,c,d
x,1,1,1
y,1,1,0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多