2

假设我有这两个文件:

文件 1: 1 2 3 4 5 6 7

文件 2:

1
2
3
4
5
6
7

是否可以diff用来比较这两个文件,结果是equal

(或者如果没有,我应该使用哪些其他工具?)

谢谢

4

3 回答 3

2

您可以折叠空格,file2看起来像file1,每个数字都在同一行:

$ cat file1
1 2 3 4 5 6 7
$ cat file2
1
2
4
3
5
6
7
$ diff <(echo $(< file1)) <(echo $(< file2))
1c1
< 1 2 3 4 5 6 7
---
> 1 2 4 3 5 6 7

解释:

< file             # Equivalent to "cat file", but slightly faster since the shell doesn't
                   #     have to fork a new process.

$(< file)          # Capture the output of the "< file" command. Can also be written
                   #     with backticks, as in `< file`.

echo $(< file)     # Echo each word from the file. This will have the side effect of
                   #     collapsing all of the whitespace.

<(echo $(< file))  # An advanced way of piping the output of one command to another.
                   #     The shell opens an unused file descriptor (say fd 42) and pipes
                   #     the echo command to it. Then it passes the filename /dev/fd/42 to
                   #     diff. The result is that you can pipe two different echo commands
                   #     to diff.

或者,您可能希望file1看起来像file2,每个数字在单独的行上。这将产生更有用的差异输出。

$ diff -u <(printf '%s\n' $(< file1)) <(printf '%s\n' $(< file2))
--- /dev/fd/63  2012-09-10 23:55:30.000000000 -0400
+++ file2   2012-09-10 23:47:24.000000000 -0400
@@ -1,7 +1,7 @@
 1
 2
-3
 4
+3
 5
 6
 7

这类似于第一个命令echo更改为printf '%s\n'在每个单词后放置一个换行符。

注意:如果要比较的文件过长,这两个命令都将失败。这是因为命令行长度的限制。如果发生这种情况,那么您将需要解决此限制,例如将 echo/printf 的输出存储到临时文件中。

于 2012-09-11T03:38:38.457 回答
1

一些差异有-b(忽略空格)和-w(忽略空格),但由于 unix 实用程序都是面向行的,我不认为空格会包含\n字符。

Dbl-检查您的版本diff是否没有带有diff --help | lessor的花哨的 gnu 选项man diff

您上面的格式是否正确,文件 1,数据都在一行上?您可以强制 file2 将该格式与

awk '{printf"%s ", $0}' file2 

或如评论中所述,转换文件 1

awk '{for (i=1;i<=NF;i++) printf("%s\n", $i)}' file1

但我猜你的数据并不是那么简单。此外,当您最没有时间处理它们时,可能会出现行长度限制。

可能不是你想听到的,diff像源代码这样复杂的东西并不是一门精确的科学。因此,如果您仍然需要帮助,请创建一个稍微复杂的测试用例并将其添加到您的问题中。

最后,您需要向我们展示您期望这样一个差异项目的输出是什么样子。现在我看不到任何有意义的方式来显示非平凡案例的这种差异。IHTH

于 2012-09-11T03:37:21.280 回答
1

如果事实证明数据确实足够简单,不会遇到限制,并且文件之间的唯一区别是第一个用空格分隔,第二个用换行符分隔,您也可以进行进程替换(如上所述)但是用 sed 用换行符替换第一个文件中的空格:

diff <(sed 's/ /\n/g' file1) file2
于 2012-09-11T07:28:54.560 回答