使用 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