uniq +没有从文件中获取唯一的字符串

时间:2010-11-22 16:40:00

标签: bash

请查看以下内容 我想要的是从文件中获取node_name字符串并执行uniq以获取uniq字符串(如果它们相等

但是在下面的示例中,我有两条相等的行(node_name moon1)

但是为什么uniq命令不会将它减少到一行? ,我真的不明白这个为什么?

 sed s'/=/ /'g file|  awk -v WORD=node_name '$2 == WORD {print $0}' | awk '{print $2" "$3}' | sort | uniq

 node_name moon1
 node_name moon1

文件:

  .
  .

 /home/home1/home2/config1/COMPANY/my.config      node_name=moon1
 /home/home1/home2/config1/MEAS2XML/my.config.tmp node_name=moon1

  .
  .

4 个答案:

答案 0 :(得分:5)

uniq无法合并相同的行有两个主要原因:

  • 这些线条并不完全相同 - 额外的尾随空格在这里是一个常见的怀疑。 awk命令应该过滤这个例子中的那些,但你仍然可以检查它。混合线终结器也是可能的原因。

  • 这些行不相邻 - 排序可以并且无法对行进行排序"正确"如果区域设置不正确。我已经看到了非ASCII文本的奇怪案例,其中相同的行不会一个接一个地结束。在uniq命令之前检查sort的输出。您的区域设置是什么?

顺便说一句,'排序-u'是排序的更好的选择uniq的'

编辑:

似乎是这些问题中的一个或两个:

  • 您有混合的行终止符。如果你的某些行以LF(\ n,Unix样式终结符)结束,而某些行以CR / LF结尾(\ r \ n,DOS样式的终结符),uniq会将它们视为不同的行,即使它们在其他方面是相同的。

  • 在一些行中跟踪空白以及CR / LF DOS样式的行终止符。大多数(所有?)unix实用程序(包括awk)不将CR(回车符,' \ r')字符视为空格。如果您的其中一行没有任何其他尾随空格,则CR将被视为其最后一个字段的一部分并打印出来。另一方面,在最后一个字段和CR之间有空格的行中,awk打印的最后一个字段不包含CR。

在这种情况下,将CR / LF行终止符更改为LF将解决这两个问题,尽管它通常也最好过滤尾随空格:

  • dos2unix是首选方式
  • 作为替代方案,请通过sed 's|\r$||'
  • 过滤您的文件

答案 1 :(得分:1)

听起来你的文件中有杂散字符。首先使用以下方法清洁它:

dos2unix your_file

此外,与您的问题无关,但您可以仅使用sort | uniq替换sort -u

答案 2 :(得分:0)

我没有尝试过您在问题中指定的命令,而是运行以下命令:

cat foo | cut -d \ = -f 2 | sort | uniq

其中“foo”是一个包含示例中2行的文件。 以上的输出是“moon1”。

比你的例子简单,因为我假设每行只有一个'name = value'对;我对你的文件格式一无所知。

希望无论如何都有帮助...

答案 3 :(得分:0)

我遇到了类似的问题,但除了删除重复的行之外,我还想确保行的顺序也得到维护。将uniq和sort结合起来就会失败。

幸运的是,awk提供了解决方案

$ awk'!x [$ 0] ++'filename.txt

awk and duplicate lines