입력하기 때문에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/
join
join
sort
$ 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
실행할 명령이 하나만 있을 때 쉘이 분기되지 않는 일반적인 최적화를 방지하기 위한 것입니다.)