我想打印一个行列表,其中两个文件中的第一个单词相同,而其余单词则不同。和可能会出现一些复杂的混乱comm
,但希望有一种更简单的方法。grep
cut
编辑: 我已经成功地把一些东西拼凑在一起了工作代码。测试示例:
$ 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
, tr
thingy 将产生bar|foo
.这是用作扩展正则表达式的一部分来grep -E
过滤 的输出diff -u
。
命令行的输出是:
-bar c d
+bar x y