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

jon*_*jon 2 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
Run Code Online (Sandbox Code Playgroud)

文件:

  .
  .

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

  .
  .
Run Code Online (Sandbox Code Playgroud)

thk*_*ala 5

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

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

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

顺便说一下,'sort -u'是'sort |的更好选择 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$||'