检查文件的所有行是否唯一

snr*_*snr 12 text-processing

我有一个包含如下行的文本文件:

This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
.
.
.
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
Run Code Online (Sandbox Code Playgroud)

我如何确定每一行的唯一性?

注意:目标是测试文件,而不是在存在重复行的情况下修改它。

iru*_*var 25

awk解决方案:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"
Run Code Online (Sandbox Code Playgroud)

  • +1 接受的答案会通读整个文件两次,而一旦在一次阅读中遇到重复的行,就会停止。这也适用于管道输入,而其他需要它可以重新读取的文件。 (4认同)
  • @IgnacioVazquez-Abrams 回声真的没有意义。做`&& echo`或`|| echo` 是答案中的约定,用于指示命令使用退出状态代码执行正确的操作。重要的是`exit(1)`。理想情况下,您可以像这样使用`if has_only_unique_lines file; 然后...`,而不是`if [[ $(has_only_unique_lines file) = "no dupes" ]]; 然后……`,那太傻了。 (2认同)
  • 在其他答案读取文件两次以节省内存的情况下,如果没有重复,这会将整个文件读入内存。 (2认同)

Jef*_*ler 24

[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique
Run Code Online (Sandbox Code Playgroud)


jes*_*e_b 22

使用sort/ uniq

sort input.txt | uniq
Run Code Online (Sandbox Code Playgroud)

要仅检查重复行,请使用-duniq 选项。这将仅显示重复的行,如果没有,则不显示任何内容:

sort input.txt | uniq -d
Run Code Online (Sandbox Code Playgroud)

  • 这并没有达到他想要的效果。他想知道“是否”存在重复项,而不是删除它们。 (2认同)

slm*_*slm 5

TLDR

最初的问题不清楚,并且读到 OP 只是想要一个文件内容的唯一版本。如下所示。在问题的自更新形式中,OP 现在声明他/她只是想知道文件的内容是否唯一。


测试文件内容是否唯一

您可以简单地用于sort验证文件是否唯一或包含重复项,如下所示:

$ sort -uC input.txt && echo "unique" || echo "duplicates"
Run Code Online (Sandbox Code Playgroud)

例子

假设我有这两个文件:

重复样本文件
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
Run Code Online (Sandbox Code Playgroud) 独特的样本文件
$  cat uniq_input.txt
A
B
C
D
Run Code Online (Sandbox Code Playgroud)

现在,当我们分析这些文件时,我们可以判断它们是唯一的还是包含重复项:

测试重复文件
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
Run Code Online (Sandbox Code Playgroud) 测试唯一文件
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique
Run Code Online (Sandbox Code Playgroud)

原始问题(文件的唯一内容)

只需sort

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680
Run Code Online (Sandbox Code Playgroud)