2012-05-07 3 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 

EDIT:

Я нашел пример, который работает.

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 }}' 

Когда отсчет два, он выводит строку. Когда счетчик больше или равен двум, он печатает строку. Таким образом, для второго появления строка печатается дважды, чтобы «догнать».

+0

Хорошее решение. Благодарим вас за помощь. – Tedee12345

+0

@ Tedee12345: Обратите внимание, что это может слегка повлиять на порядок. –

+0

@ Деннис Уильямсон Можете ли вы привести пример этой темы? – 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