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

标签 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 等的基本使用有一些了解,但我不确定如何操作文件以获得上述输出。

任何帮助将不胜感激!

最佳答案

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.htmlAwk array iteration for multi-dimensional arrays和官方文档:http://www.gnu.org/software/gawk/manual/html_node/Multi_002ddimensional.html 。我建议这样做。

关于linux - 如何使用 bash/awk 根据另一个列表的值找到列表中的 X 个最高值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20463391/

相关文章:

Python 子进程.CalledProcessError : returned non-zero exit status 2

arrays - 调用/创建数组时从 csv 指定源行

bash:如何将多个命令应用于同一文件并连接输出

bash - 使用 awk 删除前导零给出八进制结果

ubuntu - 无法在 RVM 上切换其他 ruby​​ 版本

c - dlmopen() 无法解析创建的命名空间中定义的函数符号

java - unix java 类路径 cp 添加

regex - 分割数据,用空格分隔

terminal - 如何在 konsole/yakuake 启动时自动启动 tmux?