2

次の 2 つのファイルがあるとします。

ファイル 1: 1 2 3 4 5 6 7

ファイル 2:

1
2
3
4
5
6
7

diffこれらの 2 つのファイルを比較して、結果が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 出力が生成されます。

$ 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

一部のdiffには-b(空白を無視する)と-w(空白を無視する)がありますが、UNIXユーティリティはすべて行指向であるため、空白に文字が含まれることはありません\n

Dbl-お使いのバージョンにまたはdiffが付いた派手なgnu-optionsがないことを確認してください。diff --help | lessman diff

上記のフォーマットは正しいですか、ファイル1、データはすべて1行にありますか?file2をそのフォーマットと一致させることができます

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

またはコメントで述べたように、ファイル1を変換します

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

しかし、あなたのデータはそれほど単純ではないと思います。また、それらに対処する時間が最も少ないときに現れる行の長さの制限がある可能性があります。

おそらくあなたが聞きたいdiffものではなく、ソースコードのような複雑なものを使用することは正確な​​科学ではありません。したがって、それでもヘルプが必要な場合は、もう少し複雑なテストケースを作成して、質問に追加してください。

最後に、このようなdiffプロジェクトの出力がどのようになると予想されるかを示す必要があります。今のところ、重要なケースでそのような違いを表示する意味のある方法はわかりません。IHTH

于 2012-09-11T03:37:21.280 に答える
1

データが実際に制限に遭遇しないほど単純であることが判明し、ファイル間の唯一の違いは、最初のファイルがスペースで区切られ、2 番目のファイルが改行で区切られていることだけである場合、プロセス置換を行うこともできます (上で提案したように)。 sed を使用して、最初のファイルのスペースを改行に置き換えます。

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