Как я могу эмулировать `uniq -d` в awk?

У меня есть система busybox, в которой нет uniq, и я хотел бы создать уникальный список повторяющихся строк.

Обычный uniq, эмулированный в awk, будет:

sort <filename> | awk '!($0 in a){a[$0]; print}'

Как я могу использовать awk (или sed в этом отношении, а не perl) для выполнения:

sort <filename> | uniq -d

person Jamie    schedule 04.06.2012    source источник


Ответы (3)


Можно сделать это (не нужно сортировать):

awk '{++a[$0]; if(a[$0] == 2) print}'
person Benoit    schedule 04.06.2012
comment
не знал, что вы можете делать ассоциативные массивы. - person Jamie; 04.06.2012
comment
@Jamie: Это именно то, что вы используете в своем первом примере, даже если вы думали, что это на самом деле набор. - person Benoit; 04.06.2012

В системе busybox вам может понадобиться сохранить байты. ;-)

awk ++a[\$0]==2
person Dennis Williamson    schedule 04.06.2012
comment
вы все еще можете избавиться от двух пробелов. - person Benoit; 04.06.2012
comment
и если вы поместите alias a='awk ++a[\$0]==2' в свой bashrc, вы можете избавиться от всех символов, кроме одного. :) - person Benoit; 04.06.2012

Это может сработать для вас:

# make some test data
seq 25 >/tmp/a
seq 3 3 25 >>/tmp/a
seq 5 5 25 >>/tmp/a
# run old command
sort -n /tmp/a | uniq -d
3
5
6
9
10
12
15
18
20
21
24
25
# run sed command 
sort -n /tmp/a | 
sed ':a;$bb;N;/^\([^\n]*\)\(\n\1\)*$/ba;:b;/^\([^\n]*\)\(\n\1\)*/{s//\1/;P};D' 
3
5
6
9
10
12
15
18
20
21
24
25
person potong    schedule 04.06.2012