在Unix系统中的文本文件中查找相似的行

时间:2019-05-25 21:33:10

标签: unix

我有一个名为tt.txt的文件,该文件的内容如下:

fdgs
jhds
fdgs

我正在尝试获取与文本文件中的输出相似的行。

我的预期输出是:

fdgs
fdgs

为此,我使用了以下命令:

uniq -u tt.txt > output.txt

但它返回:

fdgs
jhds
fdgs

您知道如何解决吗?

2 个答案:

答案 0 :(得分:1)

如果用相似的行表示内容相同的行。

在uniq manpage中,uniq命令仅从重复的行中过滤相邻的匹配行。因此,您需要首先对输入进行排序,并使用-D选项来打印所有重复的行,如下所示。但是,-D选项仅限于GNU实现,并且这样做将以与输入不同的顺序打印输出。

  

排序tt.txt | uniq -D

如果您希望输出的顺序相同,则需要记住输入的行号并像这样再次对行号进行排序

  

cat -n tt.txt |排序-k 2 | uniq -f 1 -D |排序-k 1,1 | sed's / \ s + [0-9] + \ s + //'

  • cat -n将打印带有行号的内容
  • sort -k 2将从第二列开始对输入进行排序
  • uniq -f 1会忽略第一列
  • sort -k1,1将按原始行号对输出进行排序
  • sed's / \ s + [0-9] + \ s + //'将删除行号为
  • 的第一列

uniq -u命令将仅输出唯一的输入行,这与您想要的完全相反。

答案 1 :(得分:1)

awk中的一个:

$ awk '++seen[$0]==2;seen[$0]>1' file
fdgs
fdgs