使用awk在文件中打印重复的行

时间:2016-04-08 17:54:03

标签: awk sed

我需要在uniq -D选项不支持的文件中打印所有重复的行。所以我在考虑使用awk打印重复行的另一种方法。我知道,我们在awk中有一个选项,如下所示。

TESTFILE.TXT

apple
apple
orange
orange
cherry
cherry
kiwi
strawberry
strawberry
papaya
cashew
cashew
pista

命令:

awk 'seen[$0]++' testfile.txt

但是上面只打印了唯一的重复行。我需要uniq -D命令检索的相同输出。

apple
apple
orange
orange
cherry
cherry
strawberry
strawberry
cashew
cashew

6 个答案:

答案 0 :(得分:13)

无需解析文件两次:

$ awk 'c[$0]++; c[$0]==2' file
apple
apple
orange
orange
cherry
cherry
strawberry
strawberry
cashew
cashew

答案 1 :(得分:3)

如果你想坚持使用普通的awk,你必须处理两次文件:一次生成计数,一次消除计数等于1的行:

awk 'NR==FNR {count[$0]++; next} count[$0]>1' testfile.txt testfile.txt

答案 2 :(得分:1)

这可能适合你(GNU sed):

func<T,TResult>()

将两行读入模式空间(PS)。如果前两行是重复的,则打印它们并循环返回并读取第三行。如果第三行或后续行重复,则打印第一行并循环返回并读取另一行。否则,删除除最后一行之外的所有行并循环返回并读取另一行等。

答案 3 :(得分:0)

这样的话,如果uniq支持-d

grep -f <(uniq -d testfile.txt ) testfile.txt

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你可以这样做:

$ uniq -d file | awk '1;1'