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)
这可以是一种方式:
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)