首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >uniq +未从文件中获取uniq字符串

uniq +未从文件中获取uniq字符串
EN

Stack Overflow用户
提问于 2010-11-23 00:40:00
回答 4查看 3.2K关注 0票数 2

请看一下下面的代码,我想要的只是从文件中获取node_name字符串,如果它们相等,执行uniq来获取uniq字符串。

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

但是为什么uniq命令不把它减少到一行呢?我真的不明白为什么?

代码语言:javascript
复制
 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

文件:

代码语言:javascript
复制
  .
  .

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

  .
  .
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-23 01:02:33

uniq合并相同行失败的主要原因有两个:

  • 这几行代码并不完全相同--这里通常会出现多余的尾随空格。awk命令应该过滤本例中的那些内容,但您可以对此进行检查。混淆的行终止符也是一个可能的原因。
  • 行不相邻-如果区域设置不正确,sort可以也将无法“正确”对行进行排序。我见过非ASCII文本的奇怪情况,相同的行将不会一个接一个地结束。在uniq命令之前,检查sort的输出。您的区域设置是什么?

顺便说一句,'sort -u‘是'sort | uniq’的更好的替代。

编辑:

看起来像是这两个问题中的一个或两个:

  • 你有混合的行终止符。如果您的某些行以LF (\n,Unix风格的终止符)结尾,而另一些行以CR/LF (\r\n,DOS风格的终止符)结尾,则uniq会将它们视为不同的行,即使它们在某些行中与CR/LF DOS风格的行终止符一起是identical.
  • Trailing空白。大多数(all?)不认为CR (回车符,'\r')字符为空格unix实用程序,包括awk。如果您的某一行没有任何其他尾随空格,则CR将被视为其最后一个字段的一部分并被打印出来。另一方面,在最后一个字段和CR之间有空格的行中,awk打印的最后一个字段将不包含CR。

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

作为替代方法,

  • dos2unix是
  • 的首选方式,可通过sed 's|\r$||'

过滤您的文件

票数 5
EN

Stack Overflow用户

发布于 2010-11-23 01:00:55

听起来你的文件里有一些乱码。首先使用以下命令进行清洁:

代码语言:javascript
复制
dos2unix your_file

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

票数 1
EN

Stack Overflow用户

发布于 2010-11-23 01:04:06

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

分类|cut -d \= -f 2|排序|uniq

其中"foo“是包含示例中的2行代码的文件。上面的输出是"moon1“。

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

无论如何,我希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4247791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档