比较两个数据流而不将两者都存储为文件

比较两个数据流而不将两者都存储为文件

我有这两个文件:-

[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

我试图找出两个文件之间的差异;所以我使用以下命令:-

[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

来自进程替换维基:http://en.wikipedia.org/wiki/Process_substitution

Unix diff 命令通常接受要比较的两个文件的名称,或一个文件名和标准输入。进程替换允许您直接比较两个程序的输出:

$ diff <(排序文件1) <(排序文件2)

<(command)表达式告诉命令解释器运行命令并使其输出显示为文件。该命令可以是任意复杂的 shell 命令。

同样使用亚什的进程重定向(在具有 的系统上/dev/fd/n):

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

或者使用任何类似 Bourne 的 shell 会更麻烦(在带有 的系统上/dev/fd/n):

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

相关内容