如何仅打印文本文件中的重复值?


68

假设有一列数字值,如下所示:

文件1:

1 
2
3
3
3
4
4
4
5
6

我想要输出:

3  
4

也就是说,只有重复的行。是否有任何命令行工具可以在Linux中找到答案?(注意:这些值是按数字排序的)。


3
请参阅man uniq
jasonwryan

Answers:


118

您可以uniq(1)为此使用:

uniq -d file.txt

这只会打印出重复项。需要对输入文件进行排序,以使所有重复项都是连续的(看起来好像是连续的),因此如果不是,则首先通过排序运行它。


1
如果我只希望打印一式三份怎么办?
MiNdFrEaK

8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'一式三份;用N代表任何N替换“ 3”
full.stack.ex12-10-22

@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'(一式三份)

@camh也可以在csv文件上执行此操作吗?只有某一列的值?
NumenorForLife 2015年

1
排序file.txt | uniq -d
ron

1

使用uniqawk

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'

6
这项工作,但是我不明白为什么用管道输送cat?的输出?
Bernhard

1
并非所有人都知道您可以做到,uniq -c File1并且使用其他许多工具也是如此。那可能就是这里发生的事情。
马提亚斯

1

执行此: perl -ne 'print if $a{$_}++' filename.txt


它给出3\n3\n4\n\4n了输入File1,这显然是错误的。
yaegashi 2015年

我发现自己正在查看的perl片段提供了每行的出现次数,因此可以根据需要对其进行管道,排序和过滤:perl -ne'$ a {$ _} ++; END {while((($ k,$ v)= each%a){printf“%d \ t%s”,$ v,$ k}}'文件名
Theophrastus

有没有办法在由给定的字段分隔符分隔的特定列上执行此操作?
Geremia'9

正如yaegashi所指出的那样,需要一个小的解决方案才能满足要求:perl -ne'print if 1 == $ a {$ _} ++'filename.txt在所有答案中,这是我的最爱,因为其他答案需要对所有数据进行完整的预处理。该答案可以更快,更有效地启动输出结果。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.