2017-04-13 3 views
1

파이프가 결합 된 여러 명령으로 작업을 감안할 때. 내가 어떻게 할 수 있니? 이 같은?GNU 병렬로 파이프와 함께 명령을 병렬로 실행 하시겠습니까?</p> <p><code>cat input/file1.json | jq '.responses[0] | {labelAnnotations: .labelAnnotations}' > output/file1.json</code></p> <p>지금, 입력 JSON 파일의 수천이 있고, 나는 모든 과정을 병렬화 GNU 병렬을 활용하고자 :

parallel cat {} | jq '...' > output/{./} ::: input/*.json

참고 : 그것은 jq의 필터 내부에 파이프가있는 경우 더욱 복잡해진다

+0

보십시오 |'과'<'각 앞에 백 슬래시를 넣어 사용하는 '병렬 --dry을 실행하지 않고 무엇을 할 것인지를 알기 위해 실행합니다. –

+0

굉장! 그리고'jq' 필터 안에 파이프가 있다면? – Drake

+0

'jq' 명령은 이미 작은 따옴표로 묶여 있으므로 잘되어야합니다. –

답변

2

https://www.gnu.org/software/parallel/man.html#QUOTING는 말한다 :

결론은 다음 인용을 다루는 피하기 위해 문제는 단지 작은 스크립트 나 함수 (함수 export -f 기억)를 작성하고 GNU 병렬 호출을 사용하는 것이 더 쉽습니다. 귀하의 경우에는

는 다음과 같이 표시됩니다

doit() { 
    cat "$1" | 
    jq '.responses[0] | {labelAnnotations: .labelAnnotations}' > "$2" 
} 
export -f doit 

parallel doit {} output/{/} ::: input/*.json 

이것에 대해 좋은 점은 당신이 그것을 테스트 할 수 있다는 것입니다 :

doit input/foo1.json output/foo1.json 

을 그리고 작동 할 때, 그것은 사소한 병렬화 .

는 GNU의 새로운 버전이도 작동합니다 병렬있는 경우 :`인용

parallel --results output/{/} -q jq '.responses[0] | {labelAnnotations: .labelAnnotations}' ::: input/*.json 
+0

고마워요! 작은 스크립트를 작성하여이 인용 문제를 해결했습니다. '-q'와'--results'에 대한 공유도 대단합니다! – Drake