
xargs
출력이 라인인 프로그램을 사용하려고 합니다.
<ARG1>
<ARG2>
...
<ARGN>
다음 명령이 실행됩니다.
command
<GLOBAL_PREFIX_1> \
<GLOBAL_PREFIX_2> \
... \
<PREFIX1> <PREFIX2> ... ARG1 <SUFFIX1> <SUFFIX2> ... \
<PREFIX1> <PREFIX2> ... ARG2 <SUFFIX1> <SUFFIX2> ... \
... \
<PREFIX1> <PREFIX2> ... ARGN <SUFFIX1> <SUFFIX2> ... \
<GLOBAL_SUFFIX_1> \
<GLOBAL_SUFFIX_2> \
...
여기서 접두사와 접미사는 미리 알려져 있지만 임의적입니다.
어쨌든 명시적으로 언급해야 한다고 생각하는 몇 가지 (아마도) 명백한 메모는 다음과 같습니다.
매개변수는 다음과 같습니다.아니요"좋아요". 개행 문자가 부족하지만 공백,
$
,(
, 등이 포함될 수 있습니다)
."
가능하다면 그것들을 하나의 거대한 문자열로 변환하거나 그 반대로 변환하는 것을 피하고 싶습니다.
네, 제가 썼다는 뜻입니다. 나진짜그냥하고 싶어1실행할 명령: 0이 아님, 2가 아님, 3이 아님,
N
...보다 일반적으로: 나는새로운 프로세스를 생성하고 싶지 않음각 매개변수에 대해.
정확성이 있다고 가정하면 더 간단한 도구가 선호됩니다. 따라서 ,
xargs
후자sed
가awk
등 보다 우선합니다.여기서는 표준 *nix 쉘 도구를 사용하려고 합니다.
분명히 Python 스크립트를 작성할 수 있지만 그게 요점은 아닙니다...
답변1
xargs는 잊어버리고 while 루프를 사용하세요. 이것은 printf가 내장되어 있다고 가정합니다.
#!/bin/sh
printf "%s\n" "command"
printf " %s\\\n" "<GLOBAL_PREFIX_1>" "<GLOBAL_PREFIX_2>" "..."
while read -r ; do
printf " <PREFIX1> <PREFIX2> ... %s <SUFFIX1> <SUFFIX2> ... \\\n" "$REPLY"
done
printf " %s\\\n" "<GLOBAL_SUFFIX_1>" "<GLOBAL_SUFFIX_2>"
printf " %s\n" "..."
PREFIXn 또는 SUFFIXn에 또는 유사한 문자가 interesting
포함된 경우 이러한 문자를 이스케이프해야 합니다.%
\
물론 sed는 작동할 수 있습니다.
sed '1i\
GP1\\\
GP2\\\
...\\
s/.*/P1 P2 & S1 S2\\/
$s/.*/&\
GS1\\\
GS2\\\
... '
awk의 경우 BEGIN 및 END 절이 있습니다.
답변2
arg 접두사와 arg 접미사에 공백이 없으면 GNU Parallel의 -X가 적합합니다.
seq 1000 | parallel -X echo global prefix argpre{}argpost global postfix
코어 수에 균등하게 분배됩니다. 마음에 들지 않으면:
seq 1000 | parallel -j1 -n10 -X echo global prefix argpre{}argpost global postfix