我在这个论坛上找到了一些关于这个主题的答案:如何用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等非常基本的使用有一点了解,但我不确定如何操作文件以获得如上所述的输出。
非常感谢任何帮助!
答案 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.html和Awk array iteration for multi-dimensional arrays以及官方文档:http://www.gnu.org/software/gawk/manual/html_node/Multi_002ddimensional.html。我建议那样走。