Linux命令比较文件内容

  • 2019 年 11 月 2 日
  • 笔记

文件准备

创建两个文件,分别为a.txt和b.txt,它们所含内容分别为:

a.txt b.txt
1-wfhune
2-chdamnsbchj
3-uyr92fiubkqw
5-cgvdnsb
2-djyv
4-dvcahsgdb
5-wvchdfyt

普通用法,整行对比

命令 diff a.txt b.txt grep -f a.txt b.txt grep -vf a.txt b.txt
解释 比较两个文件 取两个文件中都有的行 取b文件中有,但a文件中没有的行
结果 1,4c1,3
< 1-wfhune
< 2-chdamnsbchj
< 3-uyr92fiubkqw
< 5-cgvdnsb

> 2-djyv
> 4-dvcahsgdb
2-djyv
4-dvcahsgdb
5-wvchdfyt

高级用法,每行关键部分对比

回顾一下两个文件中的内容,格式都是 x-yyyy这种格式,我们认为x为键,yyyy为值。现在我们只想比较x,而不关心yyyy。

该怎么办呢?

命令 grep -vf <(cut -d – -f 1 a.txt) <(cat b.txt) grep -vf <(awk -F”-” ‘{print $1}’ a.txt) <(cat b.txt)
解释

<() 用于命令嵌套。
cut -d – -f 1 a.txt,其中参数-d 用于定义分隔符,参数-f 用于定义分割后要提取第几段文本。比如这里定义分隔符为”-“,并提取分割后的第一段文本。

这里只是用awk命令替换了cut命令,作用相同。
awk 的 -F参数用于定义分隔符,printf $X 提取分割后的第X段文本。
结果 4-dvcahsgdb 4-dvcahsgdb