Unix命令检查文件中的任何两行是否相同?


24

是否有unix命令可以检查文件中的任何两行是否相同?

例如考虑一个文件 sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

我们看到这句话

This is sentence X

重复。

是否有任何命令可以快速检测到这一点,以便我也许可以像这样执行它-

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

Answers:


40

这是获取所需确切输出的一种方法:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

说明:

内部$(sort sentences.txt | uniq -d)列出了出现多次的每一行。外部grep -nFx再次查找与这些行中的任何一条的sentences.txt精确-x匹配,-F并添加其行号-n


您发布的答案完全相同,所以我的编辑勉强击败了我。+1
casey 2014年

因此,$(command)语法可以替代吗?
CodeBlue 2014年

2
@CodeBlue-是的。这就是所谓的命令替换
grebneke 2014年

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txt会更有效率,并避免潜在的arg list too long问题。
斯特凡Chazelas

10

并非完全符合您的要求,但是您可以尝试将sortand 结合使用uniq -c -d

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2这是从man uniq以下位置找到的重复行数:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

如果文件内容适合存放在内存中,awk则可以这样做。comp.lang.awk中的标准单行代码(我无法从这台计算机上搜索实例,但每个月都有一个实例),以检测是否存在重复,即重复awk 'n[$0]++'计算每个行值的出现并打印任何出现的情况除了第一个以外,因为默认操作是print $0

要以您的格式显示包括第一次出现在内的所有出现,但如果有多个值重复出现,则可能会以混合顺序显示,变得更加挑剔:

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

为了清楚起见,多行显示,通常在实际使用中一起运行。如果经常执行此操作,则可以使用将该awk脚本放入一个文件中awk -f,或者当然可以将整个内容放入一个shell脚本中。像最简单的一样,awk可以使用来完成此操作perl -n[a]

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.