For loop awk for循环将文件分解为块

For loop awk for循环将文件分解为块,for-loop,awk,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 1383

我有一个大文件,我想按字段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被分成50000个间隔,但到2000年重叠。例如,前三个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
awk'$1==“1”&&&$2>=0&$2=48000&&$2=96000&&$2
awk'$1==“1”{n=int($2/48000);print>(“chr1.”(48*n)“kb.”(48*n+50)“kb”);n--(如果(n>=0&$2/1000)(“chr1.”(48*n)“kb”。(48*n+50)“kb”);}
或分布在多条线路上:

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=整数($2/48000)
打印>(“chr1.”(48*n)“kb。”(48*n+50)“kb”)
n--
如果(n>=0&$2/1000(“chr1.”(48*n)“kb.”(48*n+50)“kb”)
}'Highalt.Lowalt.AllegeCounts.FilteredForming.freq'
工作原理
  • $1==“1”{

    这将选择第一个字段为1的所有行。(您在文本中没有提到这一点,但您的代码应用了此限制。)

  • n=int($2/48000)

    这将计算该行所属的存储桶

  • print>(“chr1.”(48*n)“kb.”(48*n+50)“kb”)

    这会将该行写入相应的文件

  • n--

    这会使桶号递减

  • 如果(n>=0&&$2/1000(“chr1.”(48*n)“kb.”(48*n+50)“kb”)

    如果这一行也在上一个bucket的重叠范围内,那么也将其写入该bucket

  • }

    这将关闭通过选择
    $1==“1”
    启动的组

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