请查看以下内容 我想要的是从文件中获取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
.
.
答案 0 :(得分:5)
uniq无法合并相同的行有两个主要原因:
这些线条并不完全相同 - 额外的尾随空格在这里是一个常见的怀疑。 awk命令应该过滤这个例子中的那些,但你仍然可以检查它。混合线终结器也是可能的原因。
这些行不相邻 - 排序可以并且无法对行进行排序"正确"如果区域设置不正确。我已经看到了非ASCII文本的奇怪案例,其中相同的行不会一个接一个地结束。在uniq命令之前检查sort的输出。您的区域设置是什么?
编辑:
似乎是这些问题中的一个或两个:
您有混合的行终止符。如果你的某些行以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$||'
答案 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