我有一系列文本文件,我想知道它们之间共有的行,而不是不同的行。命令行Unix或Windows都可以。
文件foo:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
文件栏:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
因此,对于上面的这两个文件,所需实用程序的输出类似于file1:line_number, file2:line_number ==匹配文本(只是一个建议;我真的不在乎语法是什么):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
我认为diff工具本身,使用它统一的(-U)选项,可以用来实现效果。因为diff输出的第一列标记了该行是添加还是删除,所以我们可以查找未更改的行。
diff -U1000 file_1 file_2 | grep '^ '
数字1000是任意选择的,大到比任何单个的diff输出都要大。
下面是完整的、简单的命令集:
f1="file_1"
f2="file_2"
lc1=$(wc -l "$f1" | cut -f1 -d' ')
lc2=$(wc -l "$f2" | cut -f1 -d' ')
lcmax=$(( lc1 > lc2 ? lc1 : lc2 ))
diff -U$lcmax "$f1" "$f2" | grep '^ ' | less
# Alternatively, use this grep to ignore the lines starting
# with +, -, and @ signs.
# grep -vE '^[+@-]'
如果你想包含刚刚移动过的行,你可以在差分之前对输入进行排序,如下所示:
f1="file_1"
f2="file_2"
lc1=$(wc -l "$f1" | cut -f1 -d' ')
lc2=$(wc -l "$f2" | cut -f1 -d' ')
lcmax=$(( lc1 > lc2 ? lc1 : lc2 ))
diff -U$lcmax <(sort "$f1") <(sort "$f2") | grep '^ ' | less