使用bash的comm命令按第二列对比文件时如何返回完整行
解决方法
核心思路
comm 要求输入流按对比字段排序,你之前的命令只提取了第二列作为对比依据,自然丢失了第一列的计数值。我们可以先调整两个输入文件的列顺序,把用于对比的第二列放到行首,同时保留原第一列的计数值,待comm完成筛选后再把列顺序调换回来即可。
具体命令
输出仅在file1中存在的行(对应你示例需要的结果)
comm -23 <(awk '{print $2"\t"$1}' file1.txt) <(awk '{print $2"\t"$1}' file2.txt) | awk '{print $2"\t"$1}'
输出仅在file2中存在的行
comm -13 <(awk '{print $2"\t"$1}' file1.txt) <(awk '{print $2"\t"$1}' file2.txt) | awk '{print $2"\t"$1}'
命令说明
- 进程替换内的
awk '{print $2"\t"$1}'将原文件的列调整为「对比用的第二列+制表符+原第一列计数值」的格式,由于你的两个文件已经预先按第二列排序,调整后的输出流天然符合comm的排序要求,无需额外排序。如果你的文件是严格制表符分隔的,可将awk命令调整为awk -F'\t' '{print $2"\t"$1}'避免多空格分隔的误匹配。 - comm按行首的第二列完成筛选后,管道后的awk再将列顺序调换回你需要的「计数值+序列」格式。
- 如果后续你的文件不再保证按第二列预排序,只需要在每个进程替换的awk命令后追加
| sort即可。
内容的提问来源于stack exchange,提问作者ashenflower
相关产品推荐
相关产品推荐

