gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:49 24 4
gpt4 key购买 nike

我在这个论坛上找到了一些关于这个主题的答案:如何使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com