假设有一列数值如下:

File1:

1 
2
3
3
3
4
4
4
5
6


我想要输出:

3  
4


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

评论

请参见man uniq。

相关的更困难的问题:成对删除重复的行

#1 楼

如果文件已排序,则可以使用uniq(1)
uniq -d file.txt

如果文件未排序,请先通过sort(1)运行它:
sort file.txt | uniq -d

这只会打印出重复项。
从技术上讲,输入不需要按排序顺序,但是文件中的重复项必须是连续的。实现此目的的通常方法是对文件进行排序。

评论


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

–纳沙德·法鲁克(Nawshad Farruque)
2012年10月22日在7:55

@MiNdFrEaK排序| uniq -c | grep'^ \ s * 3 \ s'| sed's / ^ \ s * [0-9] * \ s * //'一式三份;用N重复的任何N替换“ 3”

–full.stack.ex
2012年10月22日8:10



@MiNdFrEaK排序| uniq -c | sed -n's / ^ [[:空白:]] * 3 [[:空白:]] \ {1,\} // p'一式三份

–user24222
2012-10-22 11:03



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

– NumenorForLife
15年4月4日在12:20

排序file.txt | uniq -d

–ron
17 Mar 30 '17在8:31

#2 楼


uniq要求对您的列表进行排序,默认排序为字母顺序

sort path/to/your/filename | uniq -d



cat fileName | sort | uniq -d

#3 楼

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

评论


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

– Yaegashi
2015年7月10日,0:03

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

– Theophrastus
16 Jun 2'在22:00



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

–老年性贫血
16-09-9的3:42

正如yaegashi所指出的,需要一个小的解决方案才能满足要求:perl -ne'如果1 == $ a {$ _} ++则打印'filename.txt在所有答案中,这是我的最爱,因为其他答案需要对所有数据进行完整的预处理。该答案可以更快,更有效地启动输出结果。

– BOC
19年6月14日在15:07

#4 楼

使用uniqawk

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


评论


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

–伯恩哈德
2012年10月22日17:52

并非所有人都知道您可以使用uniq -c File1以及类似的其他许多工具来完成。那可能就是这里发生的事情。

–马特西亚
16-10-24在17:15

仍然可以重定向uniq -c
– Paul_Pedant
20年7月6日在23:02