繁体   English   中英

比较两个不同文件的内容

[英]Compare the content of two different files

例如,`file1.txt,仅包含变量:

a
b
d
c

file2.txt包含< ,变量和路径:

< a /x/y/1.c
< c /x/d/7.h
< f /x/c/6.s
< b /x/v/8.mk
< t /x/1.h
< d /x/5.so

应该将file1.txt变量与file2.txt进行比较。 如果找到匹配项,则应从file2.txt打印完整的变量和路径。

预期产量:

< a /x/y/1.c
< b /x/v/8.mk
< d /x/5.so
< c /x/d/7.h

我尝试使用comm -3 file1.txt file2.txt ,但是它无法有效工作。

diff无法用于我的情况。

如果file2.txt中的行不是以<开头,则可以使用此;

join <(sort file1.txt) <(sort file2.txt)

如果以<char开头,则可以使用它;

join -11 -22 <(sort file1.txt) <(sort file2.txt)

例如;

user@host:/tmp$ join -11 -22 <(sort file1.txt) <(sort file2.txt)
a < /x/y/1.c
b < /x/v/8.mk
c < /x/d/7.h
d < /x/5.so

-11表示file1.txt和第一列,-22表示file2.txt和第二列(在“ <”字符之后)

当键不在路径中任何位置时的解决方案:尝试此操作

cat file2.txt | grep -f file1.txt

根据需要切换文件名。

您要求外壳,但我会通过python回答

import sys

with open(sys.argv[1], "r") as f:
    d = dict((e.rstrip().split()[1], e) for e in f)

with open(sys.argv[2], "r") as f:
    for e in f:
        e = e.rstrip()
        if e in d:
            print(d[e], end="")

如果将其保存到run.py ,则可以这样调用它:

python3 run.py file2.txt file1.txt > output.txt

与排序解决方案相比,它还保留了file1.txt的顺序,但将第二个文件加载到内存中。

AWK对这些事情有好处:

$ awk 'NR == FNR {keys[$0] = 1; next}keys[$2]' file1.txt file2.txt
< a /x/y/1.c
< c /x/d/7.h
< b /x/v/8.mk
< d /x/5.so

基本上,file1.txt缓存在keys数组中。 然后,如果列2在所述数组中,则打印file2的每一行:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM