両方のデータストリームをファイルとして保存せずに比較

両方のデータストリームをファイルとして保存せずに比較

私はこれらの2つのファイルを持っています: -

[root@localhost base_filters]# cat aix_old
joe
amadeus
image
bill
juliet
charlie
romeo
ftp


[root@localhost base_filters]# cut -d: -f1 passwd2
henry
amadeus
image
bill
julie
jennifer
charlie
romeo
harry

2つのファイルの違いを見つけようとしているので、次のコマンドを使用しています。

[root@localhost base_filters]# cut -d: -f1 passwd2 | sort | diff `sort aix_old` -

ただし、次のエラーが発生します。

diff: extra operand `charlie'
diff: Try `diff --help' for more information.

内容を並べ替えるために別の一時ファイルを使用できることを知っていますが、他の一時ファイルaix_oldは必要ないので、コマンド置換を試してみました。

私が何を間違っているかもしれません。

ベストアンサー1

ksh、zsh、bash の場合は、プロセス置換を使用します。

diff <(cut -d: -f1 passwd2 | sort) <(sort aix_old)

以下を提供します。

4,5c4
< harry
< henry
---
> ftp
7,8c6,7
< jennifer
< julie
---
> joe
> juliet
diff -y <(cut -d: -f1 passwd2 | sort) <(sort aix_old)

以下を提供します。

amadeus                              amadeus
bill                                bill
charlie                             charlie
harry                                 | ftp
henry                                 <
image                               image
jennifer                              | joe
julie                                 | juliet
romeo                               romeo

プロセス交換wikiから:http://en.wikipedia.org/wiki/Process_substitution

Unix diff コマンドは通常、比較する 2 つのファイルの名前、つまりファイル名と標準入力を受け入れます。プロセス置換を使用すると、両方のプログラムの出力を直接比較できます。

$diff <(ファイル 1 ソート) <(ファイル 2 ソート)

この<(command)式は、コマンドソルバーにコマンドを実行し、その出力をファイルとして表示するように指示します。コマンドは、任意に複雑なシェルコマンドである可能性があります。

また使用灰のプロセスリダイレクト(あるシステムでは/dev/fd/n):

diff /dev/fd/3 3<(cut -d: -f1 passwd2 | sort) /dev/fd/4 4<(sort aix_old)

あるいは、Bourneに似たシェルを使用する方が難しいかもしれません(あるシステムでは/dev/fd/n)。

cut -d: -f1 passwd2 | sort | {
  sort aix_old 3<&- | diff /dev/fd/3 -
} 3<&0

おすすめ記事