0

我在这个论坛上找到了一些关于这个主题的答案:如何使用 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 等非常基本的使用有一些了解,但我不确定如何操作文件以获取上述输出。

任何帮助将不胜感激!

4

1 回答 1

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

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

更新:上述代码的问题是 GAwk 不支持动态数组名称。它可以用 GAwk 以一种奇怪的方式支持的多维数组来解决,请参见此处:http ://objectmix.com/awk/27035-dynamic-array-names.html和多维数组的 Awk 数组迭代和官方文档:http ://www.gnu.org/software/gawk/manual/html_node/Multi_002ddimensional.html 。我建议走那条路。

于 2013-12-09T05:32:22.560 回答