Awk Bash:查找第n列的最大值,并在其他列上设置条件

Awk Bash:查找第n列的最大值,并在其他列上设置条件,awk,Awk,我有一个包含3列的bog文件,我希望找到第三列的最大值,并在它们具有相同的第一列时写入整行。我已经提出了我的问题,但现在的问题是,我有多行的最大数量。现在,我想在第二列中选择一个值最高的 我的数据: 1 234 0.01 1 235 0.05 1 236 0.05 1 237 0.02 2 234 0.09 2 235 0.09 2 236 0.08 2 237 0.05 输出: 1 236 0.05 2 235

我有一个包含3列的bog文件,我希望找到第三列的最大值,并在它们具有相同的第一列时写入整行。我已经提出了我的问题,但现在的问题是,我有多行的最大数量。现在,我想在第二列中选择一个值最高的

我的数据:

    1 234 0.01
    1 235 0.05
    1 236 0.05
    1 237 0.02
    2 234 0.09
    2 235 0.09
    2 236 0.08
    2 237 0.05
输出:

    1 236 0.05
    2 235 0.09
解决方案一:请尝试以下内容。这将按照输入文件的顺序处理第一个字段的值

awk '
FNR==NR{
  b[$1]=a[$1]>$3?b[$1]:$0
  a[$1]=a[$1]>$3?a[$1]:$3
  next
}
($1 in a){
  print b[$1]
  delete a[$1]
}
'   Input_file  Input_file
解决方案2:以防您不关心输出中
$1
(第一个字段)的顺序

awk '{b[$1]=a[$1]>$3?b[$1]:$0;a[$1]=a[$1]>$3?a[$1]:$3} END{for(i in a){print b[i]}}' Input_file
解决方案一:请尝试以下内容。这将按照输入文件的顺序处理第一个字段的值

awk '
FNR==NR{
  b[$1]=a[$1]>$3?b[$1]:$0
  a[$1]=a[$1]>$3?a[$1]:$3
  next
}
($1 in a){
  print b[$1]
  delete a[$1]
}
'   Input_file  Input_file
解决方案2:以防您不关心输出中
$1
(第一个字段)的顺序

awk '{b[$1]=a[$1]>$3?b[$1]:$0;a[$1]=a[$1]>$3?a[$1]:$3} END{for(i in a){print b[i]}}' Input_file
使用shell工具:

$ sort -k3nr -k2nr file | uniq -w 5
    2 235 0.09
    1 236 0.05
如果您的第一列可以匹配到一定数量的字符,那么它就可以工作<代码>man uniq:

-w, --check-chars=N
       compare no more than N characters in lines
它适用于固定宽度的第一列,如:

1    Second column
1000 Second column
但不是:

1 Second
1000 Second
使用shell工具:

$ sort -k3nr -k2nr file | uniq -w 5
    2 235 0.09
    1 236 0.05
如果您的第一列可以匹配到一定数量的字符,那么它就可以工作<代码>man uniq:

-w, --check-chars=N
       compare no more than N characters in lines
它适用于固定宽度的第一列,如:

1    Second column
1000 Second column
但不是:

1 Second
1000 Second

两者都很完美!为什么我要放两次输入文件?如果我只输入一次,它就不起作用了。两个都很好地工作!为什么我要放两次输入文件?如果我只输入一次就不行了。谢谢你的回复。它适用于示例数据,但似乎不适用于非常大的数据文件(我的真实数据集)。第一列相同的行数是10000,我应该把10001改为5吗?输出也未排序。不,N值是第一列的长度。它希望第一列的宽度是固定的。谢谢你的回复。它适用于示例数据,但似乎不适用于非常大的数据文件(我的真实数据集)。第一列相同的行数是10000,我应该把10001改为5吗?输出也未排序。不,N值是第一列的长度。它希望第一列具有固定的宽度。