如何根据bash / awk的另一个列表的值找到列表中的X最高值?

时间:2013-12-09 04:51:25

标签: linux awk konsole

我在这个论坛上找到了一些关于这个主题的答案:如何用bash / awk找到列表中的X最低值?

但我的问题有点不同。

这是inpout.txt文件的例子(一个“,”分隔的文本文件,可以作为csv文件打开):

ID, Code, Value, Store
SP|01, AABBCDE, 15, 3 
SP|01, AABBCDE, 14, 2 
SP|01, AABBCDF, 13, 2
SP|01, AABBCDE, 16, 3 
SP|02, AABBCED, 15, 2 
SP|01, AABBCDF, 12, 3
SP|01, AABBCDD, 13, 2 
SP|02, AABBCDF, 9, 2
SP|01, AABBCDF, 8, 3

我们的想法是在“值”列中打印具有2个最高值的行,以获取“代码”中的相同值(并保留标题)

输出文件的例子:

ID Code Value Store
SP|01, AABBCDE, 16, 3
SP|01, AABBCDE, 15, 3
SP|02, AABBCED, 15, 2
SP|01, AABBCDD, 13, 2
SP|01, AABBCDF, 13, 2
SP|01, AABBCDF, 12, 3

我是Linux新手,对AWK,sed,grep等非常基本的使用有一点了解,但我不确定如何操作文件以获得如上所述的输出。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

awk -F "," '
# it's the header
NR == 1 { header=$0 ; OFS=FS ; next }
# check if we stored the code already
! ( $2 in codes ) { codes[$2]=1 }
# store the max and line shift the previous max, skip to next line
$3 >= $2[1] { 
    $2[2] =  $2[1] ; 
    $2[4] = $2[3] ; 
    $2[3] = $0 ; 
    $2[1] = $3 ; 
    next 
}
# store the second greatest value
$3 > $2[2] { 
    $2[2] =  $3 ; 
    $2[4] = $0 
}
# finally print the maxes
END {
print header
for (c in codes) {
    print c[3]
    print c[4]
    }
}' INPUTFILE

注意,这会以随机顺序打印代码,但值行(在代码数组中)将被排序(desc。)。

UPDATE :上述代码的问题在于GAwk不支持动态数组名称。它可以用GAwk以奇怪方式支持的多维数组来解决,请参见此处:http://objectmix.com/awk/27035-dynamic-array-names.htmlAwk array iteration for multi-dimensional arrays以及官方文档:http://www.gnu.org/software/gawk/manual/html_node/Multi_002ddimensional.html。我建议那样走。