我有一个CSV文件,其中包含大量不同价格的重复项目,文件已排序。 我想比较所有重复的项目,看看哪个重复的项目具有最低价格,然后将具有最低价格的重复项目导出到新文件 字段用逗号分隔 所以原始的CSV文件:
01,香蕉,7.00
01,香蕉,6.00
01,香蕉,7.00
01,香蕉,9.00
02,芒果,5.00
02,芒果,3.00
02,芒果,3.00
02,芒果,4.00
输出CSV文件应为
01,香蕉,6.00
02,芒果,3.00
我目前正在用bash编码,并且想知道awk是否可以做到这一点。
答案 0 :(得分:1)
awk '!($1" "$2 in x) || x[$1" "$2] > $3 {x[$1" "$2] = $3}
END {for (item in x) print item, x[item]}' file.txt
$1" "$2
==以空格连接的前两列!(... in x)
==是...未在阵列x
中找到关键字?x[...] > $3
==是x
大于第3列的<...元素因此,如果在x中找不到项目编号+名称,或者保存的价格大于当前行,我们将在大括号中执行代码:
{x[...] = $3}
==将价格另存为x
在END
我们遍历x
中的所有项目,然后打印该项目并保存价格。
答案 1 :(得分:0)
由于文件已排序(按键分组),您可以尝试这样做以节省一些内存并保留顺序:
awk '
p!=$1 OFS $2 {
if(p)print p,v
p=$1 OFS $2
v=$3
next
}
$3<v {
v=$3
}
END{
print p,v
}
' FS=, OFS=, file
或如果$ 1是唯一键,您也可以尝试:
awk '
p x!=$1 {
if(p x)print s
p=$1
s=$0
v=$3
next
}
$3<v {
v=$3
}
END{
print s
}
' FS=, file
注意:如果它是带引号字段的csv文件,则脚本需要变得更复杂。