如何使用 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's ,因为它似乎无法拆分多个字符。trxargs

然而,上面的命令似乎仍然只为进程提供一行curl,尽管是curl并行的 8 个进程(因为参数-P 8)。

如何修复此命令,以便将 1000 行的块传递给curl,同时保持并行性?

我知道这些线路将以随机顺序到达 REST 服务,这对于我的用例来说很好。

答案1

GNU Parallel 就是为此而构建的:

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

如果您想保留 \r\n,请使用--pipe.默认传递 ~1 MB 的块:

< 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。

相关内容