AWK / Unix命令:当多列具有零值时如何删除行

时间:2016-06-22 19:18:07

标签: unix awk

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

请建议我任何AWK / unix命令。

由于

3 个答案:

答案 0 :(得分:1)

以下是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。

答案 1 :(得分:1)

这可能就是你所需要的:

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

但是我们没有看到一些样本输入/输出。

答案 2 :(得分:0)

另一个awk

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