文件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
如果要比较的字符串是数字,则进行数值比较,否则进行词汇比较。例如,100
和1.0e2
将被视为相同。更改为以f2"" == $0
在任何情况下强制进行词法比较。
根据awk
实现的不同,词法比较将像使用memcmp()
(字节到字节比较)或使用strcoll()
(两个字符串在区域设置的排序规则中排序是否相同)来完成。这可能会在某些未正确定义某些字符顺序的区域设置中产生影响,而不是像示例中那样对所有十进制数字输入产生影响。
答案4
在 中bash
,循环读取每个文件while
,比较读取的行并打印TRUE
或FALSE
适当地:
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 读取。文件通过循环中的两个输入重定向被重定向到这些文件。