xargs를 사용하여 여러 줄을 결합하는 방법

xargs를 사용하여 여러 줄을 결합하는 방법

30M 라인이 포함된 큰 입력 파일이 있습니다 \r\n. 1000라인(나머지 파일의 경우 그 이하) 청크를 curl.

나는 다음을 시도했다:

< input.xt tr -d '\r' | xargs -P 8 -r -d '\n' -n 1000 -I {} curl -s -X POST --data-binary '{}' http://...

\r여러 문자로 분할할 수 없는 것처럼 보이므로 먼저 입력에서 '를 제거했습니다 .trxargs

그러나 위의 명령은 (매개변수로 인해) 8개의 프로세스가 병렬로 연결되어 있음에도 curl불구하고 여전히 process에 대해 한 줄만 제공하는 것으로 보입니다 .curl-P 8

curl병렬성을 유지하면서 1000줄의 청크를 전달하도록 이 명령을 수정하려면 어떻게 해야 합니까 ?

나는 라인이 무작위 순서로 REST 서비스에 도착할 것이라는 것을 알고 있는데, 이는 내 사용 사례에 적합합니다.

답변1

GNU Parallel은 다음을 위해 만들어졌습니다:

< input.xt parallel -P 8 -d '\r\n' -n 1000 curl -s -X POST --data-binary '{}' http://...

\r\n을 보존하려면 --pipe기본적으로 ~1MB 청크를 전달하는 .

< input.xt parallel -P 8 --pipe curl -s -X POST --data-binary @- http://...

답변2

-I {}그리고 -n호환되지 않습니다. 인수가 명령에 전달 되도록 -n n지시 하고 인수를 가져옵니다. 각 발생은 해당 인수로 대체됩니다.xargsn-I {}{}

내가 올바르게 이해했다면 각 통화 curl마다하나매개변수는 전달된 1000개 라인으로 구성됩니다 --data-binary. 어쩌면:

<input.txt awk '{print}; NR % 1000 == 0 {printf "\0"}' |
  xargs -r0 -P8 -I {} curl -s -X POST --data-binary {} http://...

이는 1000줄(CRLF 구분 기호 포함)마다 NUL을 삽입하고 xargs -r0해당 줄에서 분할됩니다.

사이트 관리자들은 귀하가 너무 많은 요청을 보내주셔서 감사할 것이라고 생각합니다. 또한 병렬 출력이 curl심하게 인터리브될 수 있다는 점에 유의하십시오.

또한 단일 매개변수의 크기는 Linux에서 128KiB보다 클 수 없습니다.

관련 정보