s1
예를 들어 ","로 구분된 숫자 목록을 출력하는 스크립트가 있습니다 1,2,3,4
. 이제 이 숫자를 s2
스크립트에 인수로 제공하여 s2가 각 숫자에 대해 실행되고 그 결과를 별도의 줄에 출력하도록 하고 싶습니다 . 예를 들어, s2가 숫자에 2를 곱하면 내가 찾는 결과는 다음과 같습니다.
2
4
6
8
내가 지금 하고 있는 일은:
s1 | xargs -d "," | xargs -n1 s2
하지만 이런 짓을 하다니 내가 바보가 된 것 같아! 그래서 내 질문은 다음과 같습니다
올바른 접근 방식은 무엇입니까?
내 솔루션의 문제점은 xargs를 두 번 호출하고 입력을 두 번 반복한다는 것입니다. 물론 내 의견으로는 성능 관점에서 볼 때 이치에 맞지 않습니다! 대답은 xargs -d "," -n1
좋은 것 같지만 한 번만 반복되는지 잘 모르겠습니다. 이것이 실제로 사실이라면 답변에서 이를 확인해 주시면 수락하겠습니다. 그런데 Perl은 여전히 두 번 반복되고 Perl이 많은 시스템에 존재하지 않을 수 있으므로 Perl을 사용하고 싶지 않습니다.
답변1
이 방법도 똑같이 잘 작동합니다.
s1 | xargs -d "," -n1 s2
테스트 사례:
printf 1,2,3,4 | xargs -d ',' -n1 echo
결과:
1
2
3
4
목록이 출력되고 개행 문자가 뒤에 오는 경우 s1
이를 제거해야 합니다. 그렇지 않으면 마지막 호출은 다음 4\n
대신 에 사용됩니다 4
.
s1 | tr -d '\n' | xargs -d , -n1 s2
답변2
여러 매개변수를 허용할 수 있는 경우 s2
다음을 수행할 수 있습니다.
(IFS=,; ./s2 $(./s1))
서브셸 내에서 IFS를 쉼표로 일시적으로 재정의하므로 쉼표로 구분된 s2
출력이 표시됩니다. s1
서브쉘은 이전 값을 저장하거나 재설정하지 않고 IFS를 변경하는 빠른 방법입니다.
이 답변의 이전 버전은 잘못된 IFS 설정으로 인해 결과가 손상되었을 수 있습니다. 감사해요이르카초~을 위한내 실수를 지적해줘.
출력을 수동으로 루프하고 개별적으로 공급하려면 s2
IFS를 저장하고 재설정하는 방법이 여기에 설명되어 있습니다.
oIFS="$IFS"
IFS=,
for output in $(./s1); do ./s2 "$output"; done
IFS="$oIFS"
또는 이전과 같이 서브셸에서 IFS 비트를 실행합니다.
(
IFS=,
for output in $(./s1); do ./s2 "$output"; done
)
답변3
이 시도:
s1 | perl -pe 's/,/\n/g' | xargs -n1 s2