我需要比较文本文件的内容(作为一个整体而不是像 diff 命令那样逐行比较)并打印出缺失的文本。有没有命令可以这样做?提前致谢。
编辑:例如,假设 file1 具有:
1 2 3
4 5
文件 2 有:
1 5
2 3 4 6
我想比较这些文件并打印为输出:
6
该命令diff
逐行比较文本文件,在这种情况下,几乎整个文件都会被打印出来。(我的实际文件更复杂、更长,所以我举了一个简单的例子。)
答案1
由于顺序无关紧要,您可以使用 awk 打印唯一的行,但使用空格分隔行:
awk -v RS='[[:space:]]+' 'FNR==NR {a[$0]++; next} {a[$0]--} END {for (i in a) if (a[i] != 0) print i}' file1 file2
这里:
-v RS='[[:space:]]+'
将记录分隔符(RS)设置为任何空格,因此所有每一“行”都将由任何空格(包括换行符)分隔。FNR == NR
-是当前文件的FNR
记录号 ( )(或者,如果您愿意,也可以称为行号) ,是所有输入文件的总行号。因此,只要这两个相等,我们就处理的是第一个文件。NR
NR
{a[$0]++; next}
- 设置并增加当前“行”出现的次数,然后移至下一行而不处理任何其他规则。此块仅针对第一个文件运行,因此效果是此规则适用于第一个文件中的行,而下一个块适用于所有其他文件。{a[$0]--}
,减少当前“行”出现的次数。END {for (i in a) if (a[i] != 0) print i}
- 在所有输入的末尾,对于数组中的每个条目a
,如果出现次数不为 0,则打印该条目。因此,在两个文件中出现次数相等的任何“行”都将被跳过。
答案2
这是另一种解决方案:
comm -3 <( cat file1 | tr ' \t' '\n' | sort) <(cat file2 | tr ' \t' '\n' | sort) | sort -u
在哪里:
tr ' \t' '\n' | sort
用换行符替换空格和制表符,并重新排序结果comm
逐行比较已排序的文件file1
,并使用选项抑制两个文件中出现的行file2
-3
sort -u
最后,删除重复的行,这是在出现重复标记的情况下所必需的
在这种情况下,tr ' ' '\n' | sort
输出被用作comm
命令的标准输入。
答案3
另一个解决方案(python):
def readFile(fi):
return open(fi,"rb").read().decode(cod)
def process(text):
return text.replace("\n"," ").split(" ")
print(set([x for x in process(readFile(file1,"utf-8")) if not x==""]).difference(set([x for x in process(readFile(file2,"utf-8")) if not x==""])))
答案4
我会做出以下假设:您的文件由数据组成,这些数据要么用空格或换行符分隔,并且您不关心数据丢失的位置(或者知道它始终在 file2 中)。
我们要做的很简单:将两个文件中的每个空格替换为换行符,将它们连接起来,然后仅搜索单个(唯一)条目:
sort <( tr ' ' '\n' < file1 ) <(tr ' ' '\n' < file2) | uniq -u