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もかかわらず、まだプロセスに対して1行しか提供していないようです。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を超えることはできません。

関連情報