首页 > 解决方案 > 如何使用awk根据前两个字段找出第三个字段的最小值

问题描述

文件名test.file的内容如下:

333379266       834640619       88
333379280       834640621       99
333379280       834640621       66
333376672       857526666       99
333376672       857526666       78
333376672       857526666       62

前两列可能重复,我想输出前两列和第三列对应的最小值。在这种情况下,结果文件应该如下:

333379280 834640621 66
333379266 834640619 88
333376672 857526666 62

我的尝试是:

awk '{a[$1" "$2]=99999;a[$1" "$2]=a[$1" "$2]<$3?a[$1" "$2]:$3}END{for(i in a) print i,a[i]}' test.file

我的问题是:

有没有other way达到这个要求。

标签: bashawk

解决方案


您能否尝试在整个 Input_file 中查找第一个和第二个字段键的最小值。

awk '
{
  ind=$1 OFS $2
  array[ind]=(array[ind]<$3?(array[ind]?array[ind]:$3):$3)
}
END{
  for(i in array){
     print i,array[i]
  }
}'  Input_file

或根据@kent 的评论添加以下解决方案和附加条件以检查第三个字段中的空值,如下所示。

awk '
{
  ind=$1 OFS $2
  array[ind]=(array[ind]<$3||array[ind]==""?(array[ind]?array[ind]:$3):$3)
}
END{
  for(i in array){
     print i,array[i]
  }
}' Input_file

说明:为上述代码添加详细说明。

awk '                                                                ##Starting awk program from here.
{
  ind=$1 OFS $2                                                      ##Creating variable ind whose value is 1st and 2nd field.
  array[ind]=(array[ind]<$3?(array[ind]?array[ind]:$3):$3)           ##Creating array with index of variable ind and checking if its value is lesser than $3 then keep it same else assign $3 to it.
}
END{                                                                 ##Starting END block for this awk program here.
  for(i in array){                                                   ##Traversing through all elements of array here.
     print i,array[i]                                                ##Printing key of array and value of array here.
  }
}'  Input_file                                                       ##Mentioning Input_file name here.

推荐阅读