如何在unix中逐行比较两个不同的文件?

Vel*_*elu 13 diff awk text-processing

文件1:

123
234
345
456
Run Code Online (Sandbox Code Playgroud)

文件2:

123
234
343
758
Run Code Online (Sandbox Code Playgroud)

预期输出:文件 3:

TRUE
TRUE
FALSE
FALSE
Run Code Online (Sandbox Code Playgroud)

所以代码应该比较两个文件,如果匹配则打印“TRUE”,否则它应该在新文件中打印“FALSE”。任何人都可以为此提供解决方案吗?

αғs*_*нιη 56

diffbash支持<(...) 进程替换的shell 或任何其他 shell 中使用如下命令,或者您可以如下所示模拟它

diff --new-line-format='FALSE'$'\n' \
     --old-line-format='' \
     --unchanged-line-format='TRUE'$'\n' \
<(nl file1) <(nl file2)
Run Code Online (Sandbox Code Playgroud)

输出将是:

TRUE
TRUE
FALSE
FALSE
Run Code Online (Sandbox Code Playgroud)

--new-line-format='FALSE'$'\n',FALSE如果行不同,则打印,如果--old-line-format=''file1 的行不同,则禁用输出,这称为文件到 diff 命令(我们也可以交换这些,这意味着其中一个应该打印FALSE另一个应该被禁用。)

--unchanged-line-format='TRUE'$'\n', 打印TRUE行是否相同。在$'\n'C语言风格的逸出语法用于打印每行输出后一个新行。


Kus*_*nda 24

假设文件不包含制表符:

$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE
Run Code Online (Sandbox Code Playgroud)

这用于paste创建两个制表符分隔的列,在任一列中包含两个文件的内容。该awk命令比较每行的两列,TRUE如果列相同则打印,否则打印FALSE


Sté*_*las 10

假设两个文件的行数相同:

awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1
Run Code Online (Sandbox Code Playgroud)

如果要比较的字符串是数字和词法,则进行数值比较。例如,1001.0e2将被视为相同。更改为f2"" == $0在任何情况下都强制进行词法比较。

根据awk实现,词法比较将像使用memcmp()(字节到字节比较)或使用strcoll()(两个字符串是否在语言环境的排序规则中排序相同)进行。这可能会在某些语言环境中有所不同,其中某些字符的顺序没有正确定义,而不是像您的示例中的所有十进制数字输入。


wja*_*rea 7

蟒蛇 3

with open('file1') as file1, open('file2') as file2:
    for line1, line2 in zip(file1, file2):
        print(line1 == line2)
Run Code Online (Sandbox Code Playgroud)

输出:

with open('file1') as file1, open('file2') as file2:
    for line1, line2 in zip(file1, file2):
        print(line1 == line2)
Run Code Online (Sandbox Code Playgroud)

如果需要TRUE并且FALSE大写,请用以下之一替换打印行:

print(str(line1 == line2).upper())
print('TRUE' if line1 == line2 else 'FALSE')
Run Code Online (Sandbox Code Playgroud)

  • 在 Python 2 中,首先执行 `import itertools`,然后使用 `itertools.izip` 而不是 `zip`。否则它会将两个文件都读到内存中,可能会使用太多内存。 (2认同)