2013-08-12 1 views
1

유효한 xml (한 줄에 하나씩)이 들어있는 파일을 가지고 있으며 각 줄마다 하나씩 유틸리티 (xpath)를 실행하고 싶습니다. 유틸리티의 호출을 위해 모든 입력 줄을 표준 입력으로 전달하십시오.

나는 xargs를 시도하지만 표준 입력으로 라인을 통과 할 수있는 옵션이하지 않는 것 같다 : - 나는 또한 병렬 --spreadstdin을 시도

% cat <xmls-file> | xargs -p -t -L1 xpath -p "//Path/to/node" 

Cannot open file '//Path/to/node' at /System/Library/Perl/Extras/5.12/XML/XPath.pm line 53. 

을하지만 그 중 하나가 작동하지 않는 것 같습니다 : -

% cat <xmls-file> | parallel --spreadstdin xpath -p "//Path/to/node" 
junk after document element at line 2, column 0, byte 1607 

답변

1

당신이 파일의 모든 라인이 유틸리티에 대한 물적 분할 및 표준 입력을 할하려면

당신은 bash 쉘에서 루프를 사용할 수 있습니다

cat xmls-file | while read line 
do (echo $f > /tmp/input$$; 
    xpath -p "//Path/to/node" </tmp/input$$ 
    rm -f /tmp/input$$ 
); 
done 

$$는 고유 한 이름을 생성, 프로세스 ID 번호를 추가

나는 XMLS 파일 당신이 $f에 반복 원하는, 각 라인에 포함되어 가정 당신은 명령의 표준 입력으로이 원하는 명령에 대한 매개 변수가 아닙니다.

한편, 사양이 잘못되었을 수 있으며 대신 각 줄 이 명령의 일부가되어야합니다. 이 경우 에코 및 rm 행을 삭제하고 파일의 행이 필요한 모든 위치에 $ f를 포함하도록 xpath 명령을 변경하십시오.

XML을 많이 작성하지 않아서 do 명령을 편집해야 할 수도 있습니다.

+0

감사합니다. 이 가까이에있는 것 같다 그러나 루프 내 xmls 파일을 줄 바꿈 대신 공백을 분할 할 것으로 보인다. 내가 놓친 건 없니? – Himanshu

+0

이제 생각해 봅시다. 문제가 될 수 있습니다. 일반적으로 공백으로 구분 된 파일 이름 목록과 함께 사용됩니다. – Paul

+0

파일에 들어가면 따옴표로 묶어서 인용 할 수 있습니다. 반복 할 수있는 더 좋은 방법도 있습니다. – Paul

1

당신은 GNU 병렬 버전에 매우 가깝습니다. -n1 누락 :

cat <xmls-file> | parallel -n1 --spreadstdin xpath -p "//Path/to/node" 
+0

예. 이것은 내가 원했던 것입니다. – Himanshu