与GNU并行逐行读取文件

时间:2020-04-07 13:24:28

标签: bash shell unix parallel-processing

我有一个类似于以下文件:

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?谢谢!

3 个答案:

答案 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)

使过程变得更好时,您不需要parallelxargs -p
当前循环为文件中的每一行进行3个不同的cut处理。 考虑用类似的方法削减开销

while IFS= read -r f1 f2 f3 f4 f5
    do  
        echo "${f3}" >> "${f4}.bed"
    done < "file"
相关问题