2012-10-01 40 views
3

如果我們有以下結果:Unix的uniq的,排序和剪切命令刪除重複的行

Operating System,50 
Operating System,40 
Operating System,30 
Operating System,23 
Data Structure,87 
Data Structure,21 
Data Structure,17 
Data Structure,8 
Data Structure,3 
Crypo,33 
Crypo,31 
C++,65 
C Language,39 
C Language,19 
C Language,4 
Java 1.6,16 
Java 1.6,11 
Java 1.6,10 
Java 1.6,2 

我只是要比較的第一個字段(書名),並刪除除了每個第一線重複行本書記錄的數量最多。所以,結果如下:

Operating System,50 
Data Structure,87 
Crypo,33 
C++, 65 
C Language,39 
Java 1.6,16 

誰能幫我怎麼可能我不使用的uniq,排序&剪切命令?可能使用tr,頭部還是尾部?

+0

如sort -u -t,-k2nr,但它不工作 – eleven

回答

0

如果你輸入的排序,你可以使用GNU awk這樣的:

awk -F, '!array[$1]++' file.txt 

結果:

Operating System,50 
Data Structure,87 
Crypo,33 
C++,65 
C Language,39 
Java 1.6,16 

如果您輸入排序,則可以使用GNU awk這樣的:

awk -F, 'FNR==NR { if ($2 > array[$1]) array[$1]=$2; next } !dup[$1]++ { if ($1 in array) print $1 FS array[$1] }' file.txt{,} 

個結果:

Operating System,50 
Data Structure,87 
Crypo,33 
C++,65 
C Language,39 
Java 1.6,16 
0

這可能會以不同的方式來完成,但是我試着自己限制在你建議的工具:

cut -d, -f1 file | uniq | xargs -I{} grep -m 1 "{}" file 

另外,如果你是確保在第一列的話沒有更多比2個字符是相同的,你可以簡單地使用:uniq -w3 file。這告訴uniq比較不超過前三個字符。

+0

關於不使用xargs命令什麼 – eleven

+0

沒有,它沒有'xargs'是不可能的。你需要反覆調用'grep'的方法。另一個選擇是使用循環。 – dogbane

0
awk -F, '{if(P!=$1)print;p=$1}' your_file 
2

最優雅在這種情況下,似乎

rev input | uniq -f1 | rev 
+0

優雅或迂迴? – Steve

+0

@steve我會給一些在uniq中獲得'-f -1'或'-F 1'的行爲。 – sehe