如何使用 awk 脚本删除选定的行?

发布于 2024-08-09 13:31:35 字数 778 浏览 1 评论 0原文

我正在通过一些 awk 命令传输程序的输出,而且我几乎已经到达了我需要的位置。到目前为止的命令是:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

最后一位是穷人的 uniq,它在我的目标上不可用。假设上面的命令有机会产生如下输出:

GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2

我想要的是这样的:

GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2

也就是说,我想仅打印给定标记(第一个“字段”)具有最大值的行。上面的示例代表了 at 数据,因为输出将被排序(就好像它已通过 sort 命令进行管道传送一样)。

I'm piping a program's output through some awk commands, and I'm almost where I need to be. The command thus far is:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

The last bit is a poor man's uniq, which isn't available on my target. Given the chance the command above produces an output such as this:

GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2

What I'd like to have is this:

GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2

That is, I'd like to print only line that has a maximum value for a given tag (the first 'field'). The above example is representative of the at data in that the output will be sorted (as though it had been piped through a sort command).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别想她 2024-08-16 13:31:35

基于我对类似需求的答案 ,这个脚本使事情保持有序并且不会累积一个大数组。它打印每组中具有最高值的行。

#!/usr/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = $0
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = $0
    }
    prevs = s
}
END {
    print prevline
}

Based on my answer to a similar need, this script keeps things in order and doesn't accumulate a big array. It prints the line with the highest value from each group.

#!/usr/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = $0
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = $0
    }
    prevs = s
}
END {
    print prevline
}
谁人与我共长歌 2024-08-16 13:31:35

如果您不需要项目的顺序与 myprogram 输出的顺序相同,则可以使用以下方法:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'

If you don't need the items to be in the same order they were output from myprogram, the following works:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文