我有一个 csv 文件,其中包含多个列,包括序列号和图像 URL。该文件有 450 多行。
1,text1,text2,http://image_a.jpg
2,text1,text2,http://image_b.jpg
3,text1,text2,http://image_c.jpg
.
.
.
目标是下载 URL 上的图像,文件名是序列。我使用以下脚本成功完成了此操作
while IFS=, read col1 col2 col3 col4
do
curl ${col4} > ${col1}.jpg
done < myfile.csv
现在我想使用并行运行curl命令xargs -P
。 (我不想只是在后台使用,&
因为我想限制进程数量。)我看到使用-I
和 的示例-R
,但无法弄清楚如何在 xargs 命令中使用 csv 文件行中的多个字段。
我意识到 gnu parallel 和 wget 可能是更好的选择,但它们在我的 unix 环境中不可用。
谢谢。
答案1
IF Scott 可以使用建议的方法之一来获得 GNU Parallelhttps://oletange.wordpress.com/2018/03/28/excuses-for-not-installing-gnu-parallel/那么这可能会起作用:
parallel --colsep , 'curl {4} > {1}.jpg' :::: input.csv
答案2
在我看来,您必须构建命令curl
然后将它们传递给 xargs:
awk -F, '{print "curl '\''" $4 "'\'' > '\''" $1".jpg'\''"}' < input.csv | xargs -P2 -I {} sh -c '{}'
该命令看起来有点难看,因为我在 URL 和序列号/文件名两边加上了单引号,以防其中有任何 shell 特殊字符(例如&
)。