Unix - 通过匹配前 91 个字符来获取文件 2 中不在文件 1 中的记录
Unix - Want records from file 2 that are not in file 1 by matching on the first 91 characters
我想通过匹配每个文件的前 91 个字符来比较 file2 和 file1,并将完整记录从 file2 输出到 file3。我是 Unix 命令的新手,似乎无法理解这一点。
提前致谢,
杰夫
您可以使用 cmp
来比较两个文件:
$ cmp file1 file2
file1 file2 differ: byte 92, line 1
如果您只想比较前 91 个字节,您可以使用 -n
开关:
$ cmp -n 91 file1 file2
如果你想在这种情况下做一些事情(例如,将文件复制到另一个文件),你可以使用 bash 的 if
:
if cmp -n 91 file1 file2; then
cp file2 file3
fi
我生成的虚拟文件如下:
文件1
A012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
C012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
file2
Z012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 1
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 2
T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 3
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 4
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 5
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 6
那我想你想要这个:
awk '
# Processing for file1, basically create associative array entry indexed by leftmost 91 characters
FNR==NR { f1[substr([=12=],1,91)]++; next }
# Processing for second file
f1[substr([=12=],1,91)] > 0
' file1 file2
示例输出
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 2
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 4
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 5
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 6
实际上,我现在认为您可能恰恰需要其他行,如果是这样,请更改:
f1[substr([=14=],1,91)] > 0
对此:
! f1[substr([=15=],1,91)]
我想通过匹配每个文件的前 91 个字符来比较 file2 和 file1,并将完整记录从 file2 输出到 file3。我是 Unix 命令的新手,似乎无法理解这一点。
提前致谢, 杰夫
您可以使用 cmp
来比较两个文件:
$ cmp file1 file2
file1 file2 differ: byte 92, line 1
如果您只想比较前 91 个字节,您可以使用 -n
开关:
$ cmp -n 91 file1 file2
如果你想在这种情况下做一些事情(例如,将文件复制到另一个文件),你可以使用 bash 的 if
:
if cmp -n 91 file1 file2; then
cp file2 file3
fi
我生成的虚拟文件如下:
文件1
A012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
C012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
file2
Z012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 1
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 2
T012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 3
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 4
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 5
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 6
那我想你想要这个:
awk '
# Processing for file1, basically create associative array entry indexed by leftmost 91 characters
FNR==NR { f1[substr([=12=],1,91)]++; next }
# Processing for second file
f1[substr([=12=],1,91)] > 0
' file1 file2
示例输出
B012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 2
D012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 4
E012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 5
F012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Line 6
实际上,我现在认为您可能恰恰需要其他行,如果是这样,请更改:
f1[substr([=14=],1,91)] > 0
对此:
! f1[substr([=15=],1,91)]