0

我有一个 CSV 文件,其中包含大量价格不同的重复项目,并且文件已排序。我想比较所有重复的项目,看看哪个重复项目的价格最低,然后将价格最低的重复项目导出到一个新文件,字段用逗号分隔,所以原始 CSV 文件:

01,banana,7.00
01,banana,6.00
01,banana,7.00
01,banana,9.00
02,mango,5.00
02,mango,3.00
02,mango,3.00
02,mango,4.00

输出 CSV 文件应该是

01,香蕉,6.00
02,芒果,3.00

我目前在 bash 中编码,想知道 awk 是否可以做到这一点。

4

2 回答 2

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)== is ...在数组中找不到作为键x
  • x[...] > $3== 是x大于第 3 列的 ... 元素

所以如果x中没有找到商品编号+名称,或者保存的价格大于当前行,我们执行大括号中的代码:

  • {x[...] = $3}== 将价格另存为 ... 元素x

END我们循环遍历所有项目x,并打印项目和保存的价格。

于 2013-03-07T08:11:17.963 回答
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 文件,则脚本需要变得更复杂。

于 2013-03-07T10:27:41.813 回答