두 데이터 스트림을 모두 파일로 저장하지 않고 비교

두 데이터 스트림을 모두 파일로 저장하지 않고 비교

나는이 두 개의 파일을 가지고 있습니다 : -

[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)표현식은 명령 해석기에 명령을 실행하고 해당 출력을 파일로 표시하도록 지시합니다. 명령은 임의로 복잡한 쉘 명령일 수 있습니다.

또한 사용애쉬의프로세스 리디렉션(이 있는 시스템에서 /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

관련 정보