【问题标题】:AWK /Unix command: How to delete rows when multiple column having zero valuesAWK / Unix命令:当多列具有零值时如何删除行
【发布时间】:2016-06-22 19:18:07
【问题描述】:

我有一个包含 50,000 行和 200 列的文件,行/列中的大多数值都是零,所以我想删除所有行,当有超过 100 列的值为零时。

请向我推荐任何 AWK/unix 命令。

谢谢

【问题讨论】:

  • 阅读How to Ask 然后edit 你的问题包含minimal reproducible example,包括简洁、可测试的样本输入和预期输出。
  • 您是否需要区分“空”字段和具有显式 0 值的字段?您应该提供所要求的 MCVE,但您会按比例缩小它,以便您可能有 10-20 列和 5-10 行数据,并且需要拒绝例如超过 5 个零的行。一定要指出全面问题的规模;这很有帮助。但是你的 MCVE 应该小得多。

标签: unix awk


【解决方案1】:

这可能是您需要的:

awk 'gsub(/(^|[[:space:]])0([[:space:]]|$)/,"&")<100' file

但没有看到我们猜测的一些示例输入/输出。

【讨论】:

【解决方案2】:

下面是一个awk脚本,它将统计输入的每条记录(行)中的零值字段的数量,并且仅当该计数不超过100时才输出记录。

#!/usr/bin/awk -f

{
    zcount = 0;

    for (i = 1; i <= NF; ++i) {
        if ($i == 0)
            ++zcount;
        if (zcount > 100)
            next;
    }

    print;
}

要运行它,首先让它可执行:

$ chmod script.awk

那么,假设你的数据在文件data.in

$ ./script.awk data.in

或者,不使其可执行:

$ awk -f script.awk data.in

以下脚本变体允许您指定要允许的最大零数:

#!/usr/bin/awk -f

BEGIN { if (zmax == 0) zmax = 100 }

{
    zcount = 0;

    for (i = 1; i <= NF; ++i) {
        if ($i == 0)
            ++zcount;
        if (zcount >= zmax)
            next;
    }

    print;
}

你运行这个

$ ./script.awk -v zmax=90 data.in

如果您离开 -v zmax=N,第二个脚本将默认为 100。

【讨论】:

  • 其他人制作了时髦的单行字。但是,我想将我的解决方案视为“稳健”。 :-)
【解决方案3】:

另一个awk

$ awk 'BEGIN{FS=" +0 +"} NF<100' file

【讨论】:

  • 会错过第一个字段。
  • 那里可能存在一个错误。用 2 而不是 100 对其进行了测试,它过滤掉了“0 0 1”。
  • 那是因为没有检查第一个字段。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 2018-09-28
相关资源
最近更新 更多