sed를 병렬화하면 다른 출력이 제공됩니다.

sed를 병렬화하면 다른 출력이 제공됩니다.

그러나 sed 작업을 병렬화하려고 하면 병렬 버전이 작동하더라도 잘못된 출력이 반환됩니다.

나는 병렬화된 sed 작업을 원합니다(작동합니다)

sed 's/\s.*$// ; s/\(.*\)/\L\1/' < oldfile.txt > newfile.txt

위 sed 작업의 병렬 버전(어떤 이유로 작동하지 않음):

parallel -a oldfile.txt -k --block $BYTES --pipe-part "sed 's/\s.*$// ; s/\(.*\)/\L\1/'" > newfile.txt

답변1

이는 일반적으로 큰따옴표로 인해 발생합니다.

따옴표는 짜증나므로 쉘 함수를 사용해 보십시오:

mysed() {
    sed 's/\s.*$// ; s/\(.*\)/\L\1/'
}
export -f mysed

parallel -a oldfile.txt -k --block -1 --pipe-part mysed > newfile.txt

답변2

GNU는 쉘을 통해 지정한 명령을 병렬로 호출합니다. 아시다시피 이는 때로는 편리하지만 참조 문제와 환경 변수에 대한 의존성으로 인해 종종 어려움을 겪습니다 SHELL. (솔샤르와 나는 이에 대해 이야기한 적이 있습니다.)

당신은 당신이 지나가는 것이 무엇인지 병행해서 말해야 합니다.매개변수가 포함된 실행 파일, 인수가 기본 동작이라고 가정하는 대신환경변수로 명명된 프로그램이 실행하는 명령은 SHELL임의로 여러 개의 조각으로 나누어지고, 조각들은 공백으로 함께 연결된다.. 그러한 옵션은 없습니다. 가장 가까운 방법은 쉘이 올바른 명령을 실행하도록 명령을 인용하도록 병렬에 지시하는 것입니다.

parallel -a oldfile.txt -k --block $BYTES --pipe-part -q sed 's/\s.*$// ; s/\(.*\)/\L\1/' > newfile.txt

관련 정보