2012-06-04 57 views
3

我有一个busybox系统,没有uniq,我想生成一个独特的重复行列表。如何在awk中模拟`uniq -d`?

一个普通uniqawk模拟将是:

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

如何使用awk(或sed对于这个问题,不perl)来完成:

sort <filename> | uniq -d 

回答

3

能做到这一点(needn 't sort it):

awk '{++a[$0]; if(a[$0] == 2) print}' 
+0

不知道你能做到的关联数组。 – Jamie

+0

@Jamie:即使你认为它实际上是一个集合,但这正是你在第一个例子中所使用的。 – Benoit

+0

你是对的,我在看到这篇文章后反思了这一点。 – Jamie

5

在busybox系统上,您可能需要保存字节。 ;-)

awk ++a[\$0]==2 
+0

你仍然可以摆脱两个空间。 – Benoit

+0

@Benoit:和引号。 –

+0

,如果你把'alias a ='awk ++ a [\ $ 0] == 2''放到你的bashrc中,你可以除掉其中的一个字符。 :) – Benoit

0

这可能会为你工作:

# 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