File1:
1
2
3
3
3
4
4
4
5
6
我想要输出:
3
4
,即仅重复的行。是否有任何命令行工具可以在Linux中找到答案? (注意:值按数字排序)。
#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 楼
使用uniq
和awk
: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
评论
请参见man uniq。相关的更困难的问题:成对删除重复的行