请看看以下所有我想要的是从文件中获取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)
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将解决这两个问题,尽管通常最好也过滤尾随空格:
sed 's|\r$||'| 归档时间: |
|
| 查看次数: |
2719 次 |
| 最近记录: |