使用UNIX在输入文件中重复打印重复行的次数

时间:2014-04-12 04:22:07

标签: file unix duplicates

假设我有一个已排序的文件:

 AARAV,12345,BANK OF AMERICA,$145
 AARAV,12345,BANK OF AMERICA,$145
 AARAV,12345,BANK OF AMERICA,$145
 RAM,124455,DUETCHE BANK,$240

我希望输出为:

 AARAV,12345,BANK OF AMERICA,$145
 AARAV,12345,BANK OF AMERICA,$145

使用**uniq -d file**我能够找到重复的记录,但即使重复记录,它也只打印一次记录。我想多次打印它是重复的。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

假设您的文件名为Input.txt

,以下内容应该可以执行您想要的操作
uniq -d Input.txt  | xargs -I {} grep   {} Input.txt

xargs -I {}基本上告诉xargs在稍后的命令中看到{}时替换正在输入的输入。

将使用管道中的每一行输入调用

grep {} Input.txt,其中输入行将替换{}所在的位置。

为什么这样做?我们使用uniq -d查找重复的条目,然后将它们用作grep的输入模式,以匹配包含这些条目的所有行。因此,只打印重复的条目,并且它们的打印次数与文件中显示的次数完全相同。

更新:以与ksh兼容的方式打印重复项,而不是第一次出现,因为OP上显然没有bash系统

uniq -d Input.txt | xargs -L 1 | while read line
do
    grep  "$line"  Input.txt | tail -n +2; 
done

请注意,在上面的脚本中,我们假设没有行是另一行的子字符串。

答案 1 :(得分:0)

这应该为您提供所需的输出。它重复每个重复行N-1次。不幸的是输出没有排序,所以你必须再次通过排序来管道输出。

假设输入文件为input.txt

awk -F '\n' '{ a[$1]++ } END { for (b in a) { while(--a[b]) { print b } } }' input.txt | sort