나는 그것이 join
매우 유용하다고 생각합니다. 이를 통해 키 필드에서 file1을 file2와 결합할 수 있습니다.
명령 결과에 따라 이를 동적으로 수행하는 것이 가능합니까? 예를 들면 다음과 같습니다.
join -1 1 -2 1 file1 'curl http://example.com?code=$1&fmt=csv'
아마도 xargs나 명명된 파이프를 사용할 수 있을까요?
이상적으로는 file1의 각 레코드/라인에 대해 "찾기"를 수행합니다.
답변1
예, 쉘이 프로세스 대체를 지원하는 경우( bash
그리고 ksh93
실제로 그렇습니다) 다음을 수행할 수 있습니다.
$ join file1 <( yourcommand )
그러면 명령이 실행되고 join
표준 출력에 연결된 파일 설명자가 사용됩니다 file1
./dev/fd
yourcommand
curl
join
모든 입력은 정렬되어야 합니다 . 정렬된 입력 스트림은 한 번만 구문 분석할 수 있어야 합니다. 특히 입력을 정렬해야 합니다 sort -b
(선행 공백은 무시됨).
그렇지 않은 경우 다음을 수행할 수 있습니다.
$ join <( sort -b file1 ) <( yourcommand | sort -b )
답변2
명령에서 하나의 입력 파일만 가져와야 하는 경우 간단한 파이프로 충분합니다. -
표준 입력을 나타내는 파일 이름 으로 사용됩니다 .
curl 'http://example.com?code=$1&fmt=csv' | join -1 1 -2 1 file1 -
두 파일을 모두 파이프에서 가져와야 하는 경우 기본 셸 기능 이상의 기능이 필요합니다. Ksh, bash 및 zsh에는프로세스 교체, 프로그램이 파일 이름을 예상하는 곳이면 어디든 명령의 출력을 파이프할 수 있습니다.
curl 'http://example.com?code=$1&fmt=csv' | sort |
join -1 1 -2 1 <(sort file1) -
또는 동등하게 대칭
join -1 1 -2 1 <(<file1 | sort) \
<(curl 'http://example.com?code=$1&fmt=csv' | sort)
일반 sh에는 프로세스 교체가 없습니다. 여러 파이프에서 입력을 받기 위한 명령이 필요한 경우 이식 가능한 솔루션은 명명된 파이프를 사용하는 것입니다.
tmp="$(mktemp -d)"
mkfifo "$tmp/p"
sort <file1 >"$tmp/p" &
curl 'http://example.com?code=$1&fmt=csv' | sort | join -1 1 -2 1 "$tmp/p" -
rm "$tmp/p"
rmdir "$tmp"