区分相似线

区分相似线

我想打印一个行列表,其中两个文件中的第一个单词相同,而其余单词则不同。和可能会出现一些复杂的混乱comm,但希望有一种更简单的方法。grepcut

编辑: 我已经成功地把一些东西拼凑在一起了工作代码。测试示例:

$ cat file1
a 1 E
b 2 F
c 3 G

$ cat file2
a M X
b 2 Y
c 3 G

$ difff 1 file1 file2 # Differences in fields 2+3
1,2c1,2
< a 1 E
< b 2 F
---
> a M X
> b 2 Y

$ difff 1-2 file1 file2 # Differences in field 3 only
1c1
< b 2 F
---
> b 2 Y

编辑2:现在速度可以忍受(半秒比较1800行和8700行的两个文件)。

答案1

假设file1和都已file2排序(否则join将不起作用):

diff -u file1 file2 |
  grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"

解释:

join命令将输出两个文件中出现的连接字段(即两个文件中相同的行的第一个单词),每行一个。echo不过,我们tr用管道符 ( |) 替换所有空格。进行稍微复杂的操作echo(而不仅仅是join直接通过管道传输结果)的原因tr是,输出的join末尾将有一个换行符,我们这样做不是想换成管子。

对于示例文件(OP 在编辑问题之前最初给出的内容), join, echo, trthingy 将产生bar|foo.这是用作扩展正则表达式的一部分来grep -E过滤 的输出diff -u

命令行的输出是:

-bar c d
+bar x y

相关内容