我有两个不同的文件,其中一个文件中缺少某些行。我想创建一个新文件,包括两个文件之间的非公共行。例如,我有以下文件:
文件1:
id1
id22
id3
id4
id43
id100
id433
file2的:
id1
id2
id22
id3
id4
id8
id43
id100
id433
id21
我想提取file2中存在但不存在于file1中的那些行:
新文件:
id2
id8
id21
有什么建议吗?
答案 0 :(得分:2)
使用comm
utility(假设bash
为shell):
comm -13 <(sort file1) <(sort file2)
请注意输入必须排序才能使其正常工作,因此您的delta也会被排序。
comm
使用(交错的)3列布局:
-13
会抑制第1列和第2列,它们只打印file2
专有的值。
警告:要确认两个文件共有的行,它们必须与完全匹配 - 看似相同在空白方面不同的行(如本文所述问题中的示例数据中的情况,其中file1
行具有尾随空格)将不匹配。
cat -et
是一个可视化行结尾和控制字符的命令,有助于诊断此类问题。
例如,cat -et file1
会输出id1 $
之类的行,很明显在行尾有一个尾随空格(表示为$
)。< / p>
如果您希望按原样比较文件,而不是清理file1
,请尝试:
comm -13 <(sed -E 's/ +$//' file1 | sort) <(sort file2)
一种通用解决方案,用于修剪两个文件行中的前导和尾随空格:
comm -13 <(sed -E 's/^[[:blank:]]+|[[:blank:]]+$//g' file1 | sort) \
<(sed -E 's/^[[:blank:]]+|[[:blank:]]+$//g' file2 | sort)
注意:上述sed
命令需要 GNU 或 BSD sed
。
答案 1 :(得分:1)
您可以尝试对两个文件进行排序,然后计算重复的行,并仅选择计数为1的行
sort file1 file2 | uniq -c | awk '$1 == 1 {print $2}'