CHROM POS REF ALT Geno value
Chr16 616504 T C X93.968 0|1:7,28:35:99:0|1:616504_T_C:787,0,177:616504
Chr16 616504 T C BESC.1 0/0:48,0:48:99:.:.:0,114,1710:.
Chr16 616504 T C BESC.10 1|1:0,23:23:72:1|1:616504_T_C:1059,72,0:616504
Chr16 616504 T C BESC.100 0/0:34,0:34:96:.:.:0,96,1440:.
Chr16 616504 T C BESC.1001 0/0:47,0:47:99:.:.:0,120,1800:.
Chr16 616504 T C BESC.1002 0/0:39,0:39:99:.:.:0,108,948:.
我们的目标是把第一个和第三个字符从
value
列并求和,然后输出一个类似的文件,其中值列替换为该和。前两行的输出示例:
CHROM POS REF ALT Geno value
Chr16 616504 T C X93.968 1
Chr16 616504 T C BESC.1 0
以下是我当前的解决方案,其中STDIN 1是输入文件名,STDIN 2是输出文件名:
#!/bin/bash
i=0
len=$(cat $1 | wc -l)
touch $2
while read -r line; do
let "i++"
geno=$(echo "$line" | awk '{ print $6 }'| cut -c1,3 | fold -w1 | paste -sd+ - | bc)
echo "$line" | awk -v g="$geno" '{ $6=""; print $0 " " g}' >> $2
echo "Processed " "$i/$len"
done < $1
实际输入文件有1707993个条目。根据我的解决方案,这大约需要4.5小时来计算。理想情况下,我可以在一个小时内运行这个,但我不确定这有多现实。谢谢