使用 gawk 组合小数点前具有相同数字的数据点
Using gawk to combine data points with same number before decimals
我有一个文件,其中列出了这样的内容,但我想压缩它,以便数字后不再有小数,并且给出的范围从最小的小数到最大的小数。
我要去掉小数点的数字在第四列。
范围位于第 2 和第 3 列,因此 h23.1 的范围从 9380 到 10000。
输入
7 9380 10000 h23.1 word
7 10000 10240 h23.2 words
7 10240 10750 h23.3 words
8 7050 7270 t23.11 word
8 7270 7310 t23.12 word
8 7310 7930 t23.13 words
8 7930 8020 t23.2 word
8 8020 8340 t23.31 word
8 8340 8610 t23.32 words
8 8610 8970 t23.33 word
12 6600 6980 t15 word
12 5630 6140 h14.1 words
12 6140 6340 h14.2 word
12 6340 6600 h14.3 words
预期输出
7 9380 10750 h23
8 7050 8970 t23
12 6600 6980 t15
12 5630 6600 h14
不是解决方案,但有一些提示:
- 对于每一行,将第 4 列转换为 "key"
- 将第一列存储在关联数组中以将其映射到键
- 我假设第一列中的值对于每个键都是不变的
- 保留其他数组分别存储第2列和第3列的最小值和最大值
- 提示:第一次看到此键时,您必须将第 2 列和第 3 列存储为最小值和最大值
- 读取整个文件后(即在
END
块中)遍历数组,打印值。
另一种稍微简单一点的方法是在键改变时做一些事情。您的输入数据是排序的,因此您可以跟踪 previous 键,当它与 current 键不同时,您可以打印输出您跟踪的最小值和最大值,然后将最小值和最大值重置为当前行的值。
$ cat tst.awk
{ sub(/\..*/,"",) }
!= prev[4] {
if (NR>1) {
print start, prev[3], prev[4]
}
start = OFS
}
{ split([=10=],prev) }
END { print start, prev[3], prev[4] }
$ awk -f tst.awk file
7 9380 10750 h23
8 7050 8970 t23
12 6600 6980 t15
12 5630 6600 h14
我有一个文件,其中列出了这样的内容,但我想压缩它,以便数字后不再有小数,并且给出的范围从最小的小数到最大的小数。
我要去掉小数点的数字在第四列。 范围位于第 2 和第 3 列,因此 h23.1 的范围从 9380 到 10000。
输入
7 9380 10000 h23.1 word
7 10000 10240 h23.2 words
7 10240 10750 h23.3 words
8 7050 7270 t23.11 word
8 7270 7310 t23.12 word
8 7310 7930 t23.13 words
8 7930 8020 t23.2 word
8 8020 8340 t23.31 word
8 8340 8610 t23.32 words
8 8610 8970 t23.33 word
12 6600 6980 t15 word
12 5630 6140 h14.1 words
12 6140 6340 h14.2 word
12 6340 6600 h14.3 words
预期输出
7 9380 10750 h23
8 7050 8970 t23
12 6600 6980 t15
12 5630 6600 h14
不是解决方案,但有一些提示:
- 对于每一行,将第 4 列转换为 "key"
- 将第一列存储在关联数组中以将其映射到键
- 我假设第一列中的值对于每个键都是不变的
- 保留其他数组分别存储第2列和第3列的最小值和最大值
- 提示:第一次看到此键时,您必须将第 2 列和第 3 列存储为最小值和最大值
- 读取整个文件后(即在
END
块中)遍历数组,打印值。
另一种稍微简单一点的方法是在键改变时做一些事情。您的输入数据是排序的,因此您可以跟踪 previous 键,当它与 current 键不同时,您可以打印输出您跟踪的最小值和最大值,然后将最小值和最大值重置为当前行的值。
$ cat tst.awk
{ sub(/\..*/,"",) }
!= prev[4] {
if (NR>1) {
print start, prev[3], prev[4]
}
start = OFS
}
{ split([=10=],prev) }
END { print start, prev[3], prev[4] }
$ awk -f tst.awk file
7 9380 10750 h23
8 7050 8970 t23
12 6600 6980 t15
12 5630 6600 h14