2013-03-07 40 views
0

我有一个CSV文件,其中包含大量不同价格的重复项目,并对文件进行排序。 我想比较所有的重复项,看看哪些复制项目具有最低的价格,然后出口是重复用最低的价格项目到一个新的文件 的字段由逗号 所以原来的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

IM目前编码bash和在想,如果awk可以做到这一点。

+0

使用awk的琐碎,你有什么试过? – Barmar 2013-03-07 07:50:08

+0

以及我一直在寻找和尝试这个:awk'!x [$ 1,$ 2] ++'FS =“:”file.txt – CrudeCoder 2013-03-07 07:58:56

+0

但这比较了2列,并检查它们是否相同,但显然是不是我的目的,我只是想找到哪些副本更小 – CrudeCoder 2013-03-07 07:59:55

回答

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我们循环THROU gh在x中的所有项目,并打印项目并保存价格。

+0

你能解释一下每个部分的意思?我想了解这个代码,不只是复制和粘贴 – CrudeCoder 2013-03-07 08:19:44

+0

哦,我忘了提及这是一个csv文件 – CrudeCoder 2013-03-07 08:20:21

+0

叶......此代码不适用于csv文件 – CrudeCoder 2013-03-07 08:23:25

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

相关问题