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

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

文件1:

123
234
345
456

文件2:

123
234
343
758

预期输出:文件3:

TRUE
TRUE
FALSE
FALSE

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

答案1

在或任何其他支持的 shell中使用diff如下命令bash<(...) 流程替代或者你可以模仿它,如下所示:

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

输出将是:

TRUE
TRUE
FALSE
FALSE

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

--unchanged-line-format='TRUE'$'\n', 打印TRUE如果线路相同。 C$'\n'风格的转义语法用于在每行输出后打印一个新行。

答案2

假设文件不包含制表符:

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

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

答案3

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

awk '{getline f2 < "file2"; print f2 == $0 ? "TRUE" : "FALSE"}' file1

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

根据awk实现的不同,词法比较将像使用memcmp()(字节到字节比较)或使用strcoll()(两个字符串在区域设置的排序规则中排序是否相同)来完成。这可能会在某些未正确定义某些字符顺序的区域设置中产生影响,而不是像示例中那样对所有十进制数字输入产生影响。

答案4

在 中bash,循环读取每个文件while,比较读取的行并打印TRUEFALSE适当地:

while IFS= read -r -u3 line1; IFS= read -r -u4 line2; do
    [[ $line1 == $line2 ]] && echo TRUE || echo FALSE
done 3<file1 4<file2

这两个调用read分别从文件描述符 3 和 4 读取。文件通过循环中的两个输入重定向被重定向到这些文件。

相关内容