我有一个大文件,我想通过字段2分成块。字段2的值范围从大约0到大约2.5亿。
1 10492 rs55998931 C T 6 7 3 3 - 0.272727272727273 0.4375
1 13418 . G A 6 1 2 3 DDX11L1 0.25 0.0625
1 13752 . T C 4 4 1 3 DDX11L1 0.153846153846154 0.25
1 13813 . T G 1 4 0 1 DDX11L1 0.0357142857142857 0.2
1 13838 rs200683566 C T 1 4 0 1 DDX11L1 0.0357142857142857 0.2
我希望将字段2分成50,000个间隔,但重叠2,000个。例如,前三个awk命令如下所示:
awk '$1=="1" && $2>=0 && $2<=50000{print$0}' Highalt.Lowalt.allelecounts.filteredformissing.freq > chr1.0kb.50kb
awk '$1=="1" && $2>=48000 && $2<=98000{print$0}' Highalt.Lowalt.allelecounts.filteredformissing.freq > chr1.48kb.98kb
awk '$1=="1" && $2>=96000 && $2<=146000{print$0}' Highalt.Lowalt.allelecounts.filteredformissing.freq > chr1.96kb.146kb
我知道我可以使用带有i和j等变量的for循环来实现这一点。有人可以帮助我吗?
答案 0 :(得分:2)
awk '$1=="1"{n=int($2/48000); print>("chr1." (48*n) "kb." (48*n+50) "kb");n--; if (n>=0 && $2/1000<=48*n+50) print>("chr1." (48*n) "kb." (48*n+50) "kb");}' Highalt.Lowalt.allelecounts.filteredformissing.freq
或分散在多行:
awk '$1=="1"{
n=int($2/48000)
print>("chr1." (48*n) "kb." (48*n+50) "kb")
n--
if (n>=0 && $2/1000<=48*n+50)
print>("chr1." (48*n) "kb." (48*n+50) "kb")
}' Highalt.Lowalt.allelecounts.filteredformissing.freq
$1=="1"{
这会选择第一个字段为1的所有行。(您在文中没有提到这一点,但您的代码应用了此限制。
n=int($2/48000)
计算该行所属的桶。
print>("chr1." (48*n) "kb." (48*n+50) "kb")
这会将该行写入相应的文件
n--
这会减少铲斗编号
if (n>=0 && $2/1000<=48*n+50) print>("chr1." (48*n) "kb." (48*n+50) "kb")
如果此行也适合前一个存储桶的重叠范围,则也将其写入该存储桶。
}
这会通过选择$1=="1"
。