我可以在bash中更改uniq -c自动默认的列吗?

时间:2017-04-04 07:41:00

标签: bash awk uniq

我有一个包含以下列的文件:

David Smith    Bronze
Henry Jackson  Silver
David Smith    Bronze
Angela Wright  Gold
Angela Wright  Gold
David Smith    Gold
David Smith    Bronze

我试过写这段代码:

awk -F ',' '{if($6 == "name") print $6, $1}' filename.csv | sort | uniq -c

我的输出是:

4   David Smith   
2   Angela Wright 
1   Henry Jackson

是否有反转列以便名称出现在第一列中,并且他们收到的奖励数量出现在第二列?

2 个答案:

答案 0 :(得分:1)

awk可以做到这一点:

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

如果你想要它排序你可以使用管道和排序或使用awk自己的数组排序函数

答案 1 :(得分:0)

以下是一些想法,一个是sed,另一个是awk:

$ cat names.txt
David Smith
Henry Jackson
David Smith
Angela Wright
Angela Wright
David Smith
David Smith

$ uniq -c names.txt
   1 David Smith
   1 Henry Jackson
   1 David Smith
   2 Angela Wright
   2 David Smith

$ uniq -c names.txt | sed -E 's/([0-9]+) (.*$)/\2 \1/'
   David Smith 1
   Henry Jackson 1
   David Smith 1
   Angela Wright 2
   David Smith 2

$ uniq -c names.txt | awk '{count=$1; for (i=1; i<NF; ++i) $i = $(i+1); $NF=count}1'
David Smith 1
Henry Jackson 1
David Smith 1
Angela Wright 2
David Smith 2

如果你想使它漂亮,你可以在名称和计数之间使用非空格分隔符并使用管道到列:

$ uniq -c names.txt | sed -E 's/([0-9]+) (.*$)/\2|\1/' | column -t -s \|     
David Smith    1
Henry Jackson  1
David Smith    1
Angela Wright  2
David Smith    2