2012-05-07 58 views
2

我有一個文件:AWK - 只打印複製

jeden 
dwa 
jeden 
trzy 
trzy 
cztery 
piec 
jeden 

此命令打印出:

$ awk 'BEGIN {while ((getline < "file") > 0) if(a[$0]++) print }' 
jeden 
trzy 
jeden 

我想打印所有重複:

jeden 
jeden 
trzy 
trzy 
jeden 

編輯:

我找到了一個有效的例子。

awk '{if (x[$1]) { x_count[$1]++; print $0; if (x_count[$1] == 1) { print x[$1] } } x[$1] = $0}' file 

我想要做同樣的事情,但是使用getline。

+0

另:'sort file | uniq -D' – kev

+0

爲什麼要使用getline? – Kevin

+0

@Kevin因爲我會在腳本中使用它。 – Tedee12345

回答

3
awk 'BEGIN {while ((getline < "file") > 0) { a[$0]++; if(a[$0] == 2) print; if (a[$0] >= 2) print }}' 

當數量是2,它打印線。當計數大於或等於2時,它會打印該行。因此,對於第二次出現,該行被打印兩次以「趕上」。

+0

一個很好的解決方案。 謝謝你的幫助。 – Tedee12345

+0

@ Tedee12345:請注意,這可能會稍微影響順序。 –

+0

@ Dennis Williamson你能舉一個這個話題的例子嗎? – Tedee12345

0

這可能會爲你工作:

awk '{a[$1]++}END{for(x in a)if(a[x]>1)for(i=1;i<=a[x];i++)print x}' file 
+0

看起來他想要按順序排隊。 – Kevin

+0

請閱讀我的編輯。 謝謝你的幫助 – Tedee12345

1

你要麼需要存儲所有線路在內存中,或採取通過文件第二遍。做第一件事可能比較容易,除非它是一個巨大的文件,否則你可能有它的記憶。當然,你可以把它放在一行上,但爲了便於理解,這裏是一個文件。

#!/usr/bin/awk -f 

{ 
     lines[NR] = $0 
     counts[$0]++ 
}    

END { 
     for(i = 0; i < length(lines); i++) { 
       if(counts[lines[i]] > 1) { 
         print lines[i] 
       }  
     }  
} 

而且,你原來會更簡明地寫成這樣:

$ awk 'a[$0]++' file 
+0

請閱讀我的編輯。 謝謝你的幫助 – Tedee12345