我有一个类似于以下文件:
chr1 1 5 ID1 HK1
chr2 2 8 ID2 HK3
...
我想提取每个ID的所有行,并将这些行写到该ID的相应文件中。以下代码可以正常工作,但是我想将其与GNU parallel
并行化,因为只有一个内核(我有72个),这太慢了:
while IFS= read -r line
do
a=$(echo "$line" | cut -f 4- | cut -f -1)
b=$(echo "$line" | cut -f -3)
echo $b >> "$a.bed"
done < "file"
我之前使用grep
进行了此操作,但是由于某些文件的行数超过800M,因此这也太慢了。我如何将其正确传递给GNU parallel
?谢谢!
答案 0 :(得分:1)
结果证明GNU parallel
可以逐行读取文件并将该行作为参数传递:parallel -a
。
我将代码更改为:
parallel -j 60 -a temp ./make_file.sh {}
答案 1 :(得分:1)
如果您有8亿条线,我认为您需要比每条线运行作业更快的速度。
那又如何:
sort --parallel=100 -k4 input.tsv |
parallel --pipe --group-by 4 --colsep '\s+' -kN1 'cat > num{#}.bed'
newname() {
head -n1 "$1" | parallel --colsep '\s+' mv "$1" {4}.bed
}
export -f newname
ls num*bed | parallel newname
在我的系统上,这在15分钟内完成了1亿条线路。
答案 2 :(得分:0)
使过程变得更好时,您不需要parallel
或xargs -p
。
当前循环为文件中的每一行进行3个不同的cut
处理。
考虑用类似的方法削减开销
while IFS= read -r f1 f2 f3 f4 f5
do
echo "${f3}" >> "${f4}.bed"
done < "file"