名为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
可以实现这一要求。
您能尝试以下操作来查找整个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.