Linux下查找两个文本文件公共行的异常问题排查
解决两个文本文件查找公共行无输出的问题
可能的原因及处理方案
1. 换行符格式不兼容
如果文件是Windows环境创建/编辑的,行尾会是\r\n(CRLF),而Unix工具(comm、grep)默认识别\n(LF)。这会导致sort把行尾的\r当作内容一部分,使得看似相同的行无法匹配。
检查方式:
执行cat -A file1.txt和cat -A file2.txt,Windows格式的行尾会显示^M$(^M代表\r)。
解决办法:
将文件转换为Unix格式:
# 用dos2unix转换(如果已安装) dos2unix file1.txt file2.txt # 没有dos2unix的话用sed替代 sed -i 's/\r$//' file1.txt file2.txt
转换后再执行原命令即可:
comm -12 <(sort file1.txt) <(sort file2.txt) # 或 grep -wFf file1.txt file2.txt
2. 行中存在不可见空白字符
行首、行尾或中间的空格、制表符、Unicode空白字符等不可见内容,会导致两行看似相同但实际内容不一致。
检查方式:
用awk '{print length($0)}' file1.txt file2.txt对比目标行的长度,若长度不同则说明有额外字符;或用od -c file1.txt查看字符细节。
解决办法:
清理行首行尾的所有空白字符:
sed -i 's/^[[:space:]]*//;s/[[:space:]]*$//' file1.txt file2.txt
之后重新执行查找命令。
3. grep的-w参数限制匹配
-w参数要求匹配完整单词,虽然你的地址都是字母数字(属于单词字符),但如果行尾有隐藏字符,-w会判定该行不是完整单词导致匹配失败。可以先去掉-w测试:
grep -Ff file1.txt file2.txt
内容的提问来源于stack exchange,提问作者ChaosX
相关产品推荐
相关产品推荐

