web-dev-qa-db-ja.com

2つのファイル間でソートされた差分を行う簡単な方法は何ですか?

一部の行の順序が変更された2つのファイルがあります。これらを比較できるようにしたいと思います。

あるウェブサイトは次のようなものを提案しました:

diff <(sort text2) <(sort text1)

しかし、これはエラーになります:リダイレクトの名前がありません。

私はtcshを使用しています。上記のコマンドは別のシェル用ですか?

もっと良い方法はありますか?

38
mmccoo

このリダイレクト構文はbash固有です。したがって、tcshでは機能しません。

Bashを呼び出して、コマンドを直接指定できます。

bash -c 'diff <(sort text2) <(sort text1)'
56
David Schmitt

そのための関数を次に示します。

function diffs() {
        diff "${@:3}" <(sort "$1") <(sort "$2")
}

次のように呼び出します。

diffs file1 file2 [other diff args, e.g. -y]

おそらく、必要に応じて、David Schmittの回答に従って変更することができます。

13
hajamie

もっと良い方法はありますか?

はいあります。

commユーティリティを使用します。

使用法:comm [-123i] file1 file2

6
Ivan Balashov

これがシェルで機能しない場合は、3行で実行してください。

sort text1 > text1.sorted
sort text2 > text2.sorted
diff text1.sorted text2.sorted

シンプルですが動作するはずです...

3

投稿された「diff」の問題は、diffstdin経由でoneファイルしか受信できないことです。したがって、少なくとも1つのソート済みファイルを一時ファイルに書き込む必要があると思います。

diff - file.txt

stdinとfile.txtを比較します。 「-」は標準入力を表します

編集:私はプロセス置換がstdinを介して機能すると想定していました。しかし、そうではなく、上記は/dev/fd/{num}上記のVardhanDotNetで指摘したとおり。

1
Brian Agnew