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

Cod*_*lue 25 search text-processing

是否有 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
Run Code Online (Sandbox Code Playgroud)

我们看到这句话

This is sentence X
Run Code Online (Sandbox Code Playgroud)

重复。

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

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X
Run Code Online (Sandbox Code Playgroud)

gre*_*eke 40

这是获得您正在寻找的确切输出的一种方法:

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

解释:

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

  • `排序句子.txt | uniq -d | grep -nFxf-sentence.txt` 会更有效率一点,并且会避免潜在的`arg list too long` 问题。 (8认同)
  • @CodeBlue - 是的。它叫做[命令替换](https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html) (2认同)

aul*_*ron 10

不完全是你想要的,但你可以尝试结合sortuniq -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:~$ 
Run Code Online (Sandbox Code Playgroud)

2这是为该行找到的重复数,来自man uniq

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

   -d, --repeated
          only print duplicate lines
Run Code Online (Sandbox Code Playgroud)


dav*_*085 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} '
Run Code Online (Sandbox Code Playgroud)

为清楚起见以多行显示,您通常在实际使用中一起运行。如果您经常这样做,您可以将awk脚本放在一个带有 的文件中awk -f,当然也可以将整个内容放在一个 shell 脚本中。和最简单的一样,awk这可以用perl -n[a].