列唯一值linux

时间:2014-07-07 16:50:05

标签: linux unix uniq

我试图找出如何根据最后一列之前的所有值保留唯一值,但也保留最后一列数据。我还想对数据进行排序。例如:

输入
非洲是巨大的20
印度是蓝胶10 非洲是巨大的10
意大利在欧洲3
美国2014 15
意大利制作披萨3

输出:
非洲是巨大的30
美国2014 15
印度是蓝胶10 意大利制作披萨3
意大利在欧洲3

我知道你可以使用sort -n和uniq,但我不确定我可以使用的其他功能。谢谢!

2 个答案:

答案 0 :(得分:2)

uniq在这里不起作用,因为它无法构建第二列的总和。但您可以使用awk

awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' input.file

您稍微更改了输入数据,现在awk脚本需要进行一般化。虽然上面的脚本会按照第一列的值对数据进行分组并对第二列求和,但下面的脚本会将数据按第一列的值分组,直到最后一列的之前计算并计算 last 列的总和:

awk 'match($0,/.* /){a[substr($0,RSTART,RLENGTH)]+=$NF}END{for(i in a)print i,a[i]}' file

答案 1 :(得分:0)

如果你按照最后一个之前的文字排序,你应该得到 -

sed 's/\( [0-9]*$\)/,\1/' 1 |sort -t"," -k1,1 -u  |sed 's/,//'
Africa is huge 20
America 2014 15
India is blue glue 10
Italy is in europe 3
Italy makes pizza 3