쉼표로 구분된 목록을 다음 명령의 인수로 전달하는 방법

쉼표로 구분된 목록을 다음 명령의 인수로 전달하는 방법

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 설정으로 인해 결과가 손상되었을 수 있습니다. 감사해요이르카초~을 위한내 실수를 지적해줘.

출력을 수동으로 루프하고 개별적으로 공급하려면 s2IFS를 저장하고 재설정하는 방법이 여기에 설명되어 있습니다.

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

관련 정보