首页 > 解决方案 > 使用 awk 计算行范围的数量

问题描述

我有一个数据集:(file.txt)

X    Y
1    a
2    b
3    c
10   d
11   e
12   f
15   g
20   h     
25   i
30   j
35   k
40   l
41   m
42   n
43   o
46   p

我有两个 Up10 和 Down10 列,

例如:

X    Y    Up10    Down10    
35   k     3        5  

我试过了,但我无法显示第 3 列和第 4 列:

awk 'BEGIN{ FS=OFS="\t" }
  NR==FNR{ 
   a[$1]+=$3
    next
  }
  { $(NF+10)=a[$3] }
   { $(NF-10)=a[$4] }
  1
' file.txt file.txt > file-2.txt

期望的输出:

X    Y    Up10    Down10
1    a     1        5
2    b     2        5
3    c     3        4
10   d     4        5
11   e     5        4
12   f     5        3
15   g     4        3
20   h     5        3
25   i     3        3
30   j     3        3
35   k     3        5
40   l     3        5
41   m     3        4
42   n     4        3
43   o     5        2
46   p     5        1

这是 Pierre François 的解决方案:再次感谢@Pierre François

awk '
BEGIN{OFS="\t"; print "X\tY\tUp10\tDown10"}
(NR == FNR) && (FNR > 1){a[$1] = $1 + 0}
(NR > FNR) && (FNR > 1){ 
  up = 0; upl = $1 - 10
  down = 0; downl = $1 + 10
  for (i in a) { i += 0 # tricky: convert i to integer
    if ((i >= upl) && (i <= $1)) {up++}
    if ((i >= $1) && (i <= downl)) {down++}
  }
  print $1, $2, up, down;
}
' file.txt file.txt > file-2.txt

标签: awk

解决方案


这是 Pierre François 的解决方案:再次感谢@Pierre François

awk '
BEGIN{OFS="\t"; print "X\tY\tUp10\tDown10"}
(NR == FNR) && (FNR > 1){a[$1] = $1 + 0}
(NR > FNR) && (FNR > 1){ 
  up = 0; upl = $1 - 10
  down = 0; downl = $1 + 10
  for (i in a) { i += 0 # tricky: convert i to integer
    if ((i >= upl) && (i <= $1)) {up++}
    if ((i >= $1) && (i <= downl)) {down++}
  }
  print $1, $2, up, down;
}
' file.txt file.txt > file-2.txt

推荐阅读