2017-04-04 52 views
0

我有一個文件有以下的列:我可以更改uniq -c自動默認在bash中的列嗎?

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

請發佈您的完整文件,'$ 6'在這裏甚至不可見 – Inian

+0

您想要第一列中的第一個(給定)名稱還是第二個(系列)名稱?你是否放棄了另一個名字? –

回答

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 
1

AWK可以這樣做:

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

如果你需要它有序,你可以使用管道和排序或u se awk自己的數組排序功能

+0

我認爲只有GNU awk具有'asort()'功能。 –

+1

是的,我一直忘記人們喜歡使用其他版本;) – grail

相關問題