区分两个文件并在第三个文件中获得唯一的输出

区分两个文件并在第三个文件中获得唯一的输出

我对 shell 脚本非常陌生,现在正在学习它。

我有两个文件。

文件一:

1   StartInstall, CDM_2.5B263, OK       
2   EndInstall, CDM_2.5B263, SUCCESS    
3   StartPatch, CDM_2.5.0.2B1, OK       
4   StartPatch, CDM_2.5.0.3B1, OK       
5   EndPatch, CDM_2.5.0.3B1, SUCCESS 

文件2:

1   StartInstall, CDM_2.5B263, OK       
2   EndInstall, CDM_2.5B263, SUCCESS    
4   StartPatch, CDM_2.5.0.3B1, OK       
5   EndPatch, CDM_2.5.0.3B1, SUCCESS    

我应该找到文件 2 与文件 1 相比的差异。如果缺少任何行,shell 脚本应指示缺少的行并将其写入另一个文本文件(例如result.txt)。 Shell 脚本还应该指示我遗漏的行位于哪两行之间。

例如,输出应类似于Error.txt 线路缺失:

3   StartPatch, CDM_2.5.0.2B1, OK

2 到 4 之间

答案1

使用comm, 因为文件已排序:

comm -3 file1 file2 > result.txt

输出包含存在于file1但不存在的行file2,以及存在于file2但不file1带有制表符前缀的行。

如果文件未排序,请先对其进行排序。假设您使用的是 bash、ksh 或 zsh 而不是 plain sh

comm -3 <(sort file1) <(sort file2) > result.txt

答案2

这可能是最简单的方法。注意<是一个遗漏,|表明该行中的字符不同。 (第 5 行在file1.txt您的复制粘贴中缺少一些空白字符)。

$diff -y file1.txt file2.txt > diff.txt

1   StartInstall, CDM_2.5B263, OK                               1   StartInstall, CDM_2.5B263, OK
2   EndInstall, CDM_2.5B263, SUCCESS                            2   EndInstall, CDM_2.5B263, SUCCESS
3   StartPatch, CDM_2.5.0.2B1, OK                             <
4   StartPatch, CDM_2.5.0.3B1, OK                               4   StartPatch, CDM_2.5.0.3B1, OK
5   EndPatch, CDM_2.5.0.3B1, SUCCESS                          | 5   EndPatch, CDM_2.5.0.3B1, SUCCESS

这不会输出新文件,但您会得到一个 vimdiff 会话,它可以直观地比较两个文件并非常直观地突出显示丢失的行和字符。

$vimdiff file1.txt file2.txt

相关内容