我对 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