POSIX를 사용하여 정렬되지 않은 두 파일을 연결하시겠습니까? [복사]

POSIX를 사용하여 정렬되지 않은 두 파일을 연결하시겠습니까? [복사]

입력하기 때문에join정렬되어야 하며 일반적으로 명령은 다음과 같이 호출됩니다.

join <(sort file1) <(sort file2)

이는 POSIX에서 지정하지 않은 프로세스 대체를 사용하기 때문에 이식성이 없습니다.

join-표준 입력은 파일 매개변수 중 하나로 지정하여 사용할 수도 있습니다. 그러나 이것은 정렬만 허용합니다.하나파이프된 파일:

sort file1 | join - <(sort file2)

두 파일을 모두 정렬한 다음 POSIX 지정 함수만 사용하여 결과를 연결하는 쉬운 방법이 있어야 할 것 같습니다. 세 번째 파일 설명자로 리디렉션을 사용하거나 FIFO를 생성할 수도 있습니다. 그러나 나는 그것을 상상하기가 어렵습니다.

join정렬되지 않은 파일에 POSIXly를 사용하는 방법은 무엇입니까 ?

답변1

두 개의 명명된 파이프를 사용하여 이 작업을 수행할 수 있습니다(또는 명명된 파이프 하나와 stdin을 사용할 수도 있음).

mkfifo a b
sort file1 > a &
sort file2 > b &
join a b

프로세스 교체는 기본적으로 /dev/fd/이러한 fifo를 설정하여 작동합니다(사용 가능한 경우 명명된 파이프 사용). 예를 들어, bash에서는:

$ echo join <(sort file1) <(sort file2)
join /dev/fd/63 /dev/fd/62

파일 이름으로 호출할 때 bash가 어떻게 열려 있는지 확인하십시오( . (새로운 zsh, bash 및 ksh93 버전은 /dev/fd그렇지 않은 경우 명명된 파이프를 사용함)) . 따라서 파일이 열리면 두 s 모두에서 저장됩니다 . 이동하는 것을 볼 수 있습니다. 몇 가지 lsof 트릭을 통해:/dev/fd/joinjoinsort

$ sh -c 'lsof -a -d 0-999 -p $$; exit' <(sort file1) <(sort file2)
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sh      1894 anthony    0u   CHR  136,5      0t0      8 /dev/pts/5
sh      1894 anthony    1u   CHR  136,5      0t0      8 /dev/pts/5
sh      1894 anthony    2u   CHR  136,5      0t0      8 /dev/pts/5
sh      1894 anthony   62r  FIFO   0,10      0t0 237085 pipe
sh      1894 anthony   63r  FIFO   0,10      0t0 237083 pipe

(이것은 exit실행할 명령이 하나만 있을 때 쉘이 분기되지 않는 일반적인 최적화를 방지하기 위한 것입니다.)

관련 정보