在csv文件中输出最小值的副本

时间:2013-03-07 07:39:34

标签: bash csv awk duplicates

我有一个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是否可以做到这一点。

2 个答案:

答案 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文件,则脚本需要变得更复杂。