AWK:打印一个字段中具有最大值的所有行每个其他字段,包括具有最大值和多个列的相同行

2024-04-07

我很感激许多贡献者迅速提供了许多解决方案! (AWK:打印一个字段中具有最大值的所有行每个其他字段,包括具有最大值的相同行 https://stackoverflow.com/questions/75392860/awk-print-all-rows-with-max-value-in-one-field-per-the-other-field-including-id/75401868#75401868)

这个问题包括多一列的数据,我想保留每列 1 的第二列中具有最高值的行,包括包含多列的数据中具有最大值的相同行,并打印所有列。

Data

a   130 data1
a   55  data2
a   66  data3
b   88  data4
b   99  data5
b   99  data6
c   110 data7
c   130 data8
c   130 data9

所需输出

a   130 data1
b   99  data5
b   99  data6
c   130 data8
c   130 data9

代码来自@jared_mamrot完美运行并打印出所有列。

awk 'NR==FNR{if($2 > max[$1]){max[$1]=$2}; next} max[$1] == $2' file file

代码@Andre Wildberg 还提供了完美运行并打印出所有列.

awk 'arr[$1] < $2{arr[$1] = $2}
       arr[$1] == $2{n[$1,arr[$1]]++; line[$1,arr[$1],n[$1,arr[$1]]] = $0}
       END{for(i in arr){
             j=0; do{j++; print line[i,arr[i],j]} while(j < n[i,arr[i]])}}' file

下面的 awk 脚本也由 @Ed Morton 编写非常适合我之前的 2 列数据。它打印两列;键和值。

我的进一步问题是,当我的数据中有多个列时,我应该如何修改此脚本以打印所有列。

sort file | awk '
    { cnt[$1,$2]++; max[$1]=$2 }
    END { for (key in max) { val=max[key]; for (i=1; i<=cnt[key,val]; i++) print key, val } }
' 

谢谢大家的大力帮助!!!


使用任何 awk 并排序:

$ sort -k1,1 -k2,2nr file | awk '!seen[$1]++{max=$2} $2==max'
a   130 data1
b   99  data5
b   99  data6
c   130 data8
c   130 data9

or:

$ sort -k1,1 -k2,2nr file | awk '$1!=prev{prev=$1; max=$2} $2==max'
a   130 data1
b   99  data5
b   99  data6
c   130 data8
c   130 data9

原来的脚本在意识到我想太多之前:

$ sort -k1,1 -k2,2nr file | awk '!seen[$1]++{key=$1; max=$2} $1==key && $2==max'
a   130 data1
b   99  data5
b   99  data6
c   130 data8
c   130 data9

的价值seen[$1]++任何给定值 $1 第一次出现在输入中时为 0,并且当相同的 $1 再次出现时一些增量非零数字。所以,价值!seen[$1]++ is 1 (i.e. true在条件上下文中)第一次给定$在输入中可见,并且0 (false) 然后。所以,第一次a显示为$1 we set key to a and max到 $2 的任何值,即130在这种情况下。这就是为了参与!seen["a"]++.

从那时起,我们只打印 $1 的每一行a2 美元是130,在本例中只是输入的第一行。

然后同样的情况发生时b首先被视为 $1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWK:打印一个字段中具有最大值的所有行每个其他字段,包括具有最大值和多个列的相同行 的相关文章

随机推荐