awk for循环将文件分解成块

时间:2015-07-14 01:59:06

标签: for-loop awk

我有一个大文件,我想通过字段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循环来实现这一点。有人可以帮助我吗?

1 个答案:

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

  • 来关闭群组