CentOS中comm命令无法正确筛选文件差异行问题求助
搞定
comm命令输出不符合预期的问题 我猜你肯定纳闷:明明a.txt只比b.txt多了一行eres,为啥用comm -23对比后,连dsa都被当成了差异行?别着急,这问题十有八九是文件里的不可见字符或者换行符格式在搞鬼。
先搞懂为什么会出问题
comm命令的核心前提是:两个输入文件必须是已排序状态,且内容完全匹配的行会被精准对齐。你得到的意外结果说明,sort后的a.txt和b.txt里,dsa这一行其实并不完全一致——comm把它们当成了不同的行,所以才会把a.txt里的dsa也算成独有的内容。
排查和解决方法
1. 检查行尾有没有多余的空格/制表符
有时候编辑文件时不小心会在行尾加了空格,肉眼根本看不出来,但sort和comm会把这些空格当成内容的一部分。用这个命令就能把所有字符(包括不可见的)都显示出来:
# 查看a.txt的所有字符,行尾的$是换行符,其他都是可见/不可见字符 cat -A a.txt # 同样检查b.txt cat -A b.txt
如果看到a.txt里的dsa行是dsa $(多了个空格),而b.txt里是dsa$,那问题就找到了——把a.txt里的多余空格删掉就行。
2. 检查换行符是不是Windows格式
如果你的文件是在Windows系统下创建的,换行符是\r\n(也就是CRLF),而Unix/Linux系统下的sort会把\r当成普通字符处理。这就导致a.txt里的dsa其实是dsa\r,而b.txt里的是dsa,自然会被comm认为是不同行。
解决方法是把文件转换成Unix格式的换行符:
# 转换a.txt dos2unix a.txt # 转换b.txt dos2unix b.txt
要是没有dos2unix命令,也可以用tr命令临时处理(不用修改原文件):
comm -23 <(tr -d '\r' < a.txt | sort) <(tr -d '\r' < b.txt | sort)
这个命令会先去掉所有\r字符,再排序对比。
验证结果
等你把文件调整好后,再执行原来的命令:
comm -23 <(sort a.txt) <(sort b.txt)
就能得到你预期的结果:
eres
内容的提问来源于stack exchange,提问作者Null
相关产品推荐
相关产品推荐

