awk - 使用 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 列,
- Up10:从 (X) 到 (X-10) 的行数。
- Down10 :从 (X) 到 (X+10) 的行数
例如:
X Y Up10 Down10
35 k 3 5
- 对于Up10;35-10 X=35 X=30 X=25 总计 = 3 行
- 对于 Down10;35+10 X=35 X=40 X=41 X=42 X=42 总计 = 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
解决方案
这是 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
推荐阅读
- mysql - 来自 kafka spark 2.4.5 的 Spark 结构化流未保存到 mysql db
- swift - NSTouchBar 没有释放最后一次触摸的视图
- php - 如何在 Icecast 中获得即将播放的歌曲?(使用 MySQL 进行冰播)
- c# - 使用 Blazor 和 Aspnet Webapi 跟踪 HttpClient.PostAsync 进度
- android - Flutter 应用程序在 Android Studio 中停止后继续在设备上运行
- python - 根据长度删除索引
- java - 导入unicodedata时DLL加载失败:参数不正确
- arrays - 在不知道最大大小的情况下打印字符串
- java - 如何操作此字符串以在 Java 中查找和更改原始字符串的一部分?
- php - 您不能使用“markdown_to_html”过滤器,因为没有可用的 Markdown 库