使用条件AWK进行分组

Von*_*ton 1 sorting bash awk loops

你好,我有这个文本文件:

chr1      30.3
chrx      30.5
chr3      31.3
chr4      31.7
chrX      33.6
chr1      34.1
Run Code Online (Sandbox Code Playgroud)

我想得到:

30 - 31    2
31 - 32    2
32 - 33    0
33 - 34    1
34 - 35    1
Run Code Online (Sandbox Code Playgroud)

我试图使用这个bash和awk代码,但它不起作用.你可以帮帮我吗?

#!/bin/bash

for i in {30..60..1}
do
    h=$i

    let "h += 1"

    export i
    export h 

    awk -v g=$i -v c=$h '{if ($3 >= $g && $3< $c) print $0}' /home/filip/Desktop/AMrtin\ Hynek/doktor.txt | awk   'END{print $i"-"$h,"\t",NR}'

done
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 5

这可以是一种方式:

awk '{d=int($2)
      a[d]++
      if (NR==1) {min=d}
      min=(min>=d?d:min)
      max=(max>d?max:d)}
      END{for (i=min; i<=max; i++) print i, "-", i+1, a[i]+0}' file
Run Code Online (Sandbox Code Playgroud)

说明

跟踪数组中的外观,a[]然后循环遍历min和之间的索引max.

  • d=int($2) 获取数字的整数部分.
  • a[d]++ 增加该字段在数组上的出现次数.
  • if (NR==1) {min=d} 在第一行设置最小值.
  • min=(min>=d?d:min) 更新最低要求.
  • max=(max>d?max:d)} 更新最大值.
  • END{for (i=min; i<=max; i++) print i, "-", i+1, a[i]+0}循环索引打印外观.如果没有找到任何值,则按照+0技巧打印0 (感谢Jaypal!).

测试

$ awk '{d=int($2); a[d]++; if (NR==1) {min=d}; min=(min>=d?d:min); max=(max>d?max:d)} END{for (i=min; i<=max; i++) print i, "-", i+1, a[i]+0}' file
30 - 31 2
31 - 32 2
32 - 33 0
33 - 34 1
34 - 35 1
Run Code Online (Sandbox Code Playgroud)