用映射中的值替换第一个字段

Replace the first field with values from a mapping

我在 txt 文件中有一些数据(基本上是边界框注释)(space 分隔)

我想用其他字符替换多次出现的特定字符。例如

0 0.649489 0.666668 0.0625 0.260877
1 0.89485 0.445085 0.0428084 0.084259
1 0.80625 0.508509 0.0469892 0.005556
2 0.529068 0.0906668 0.0582908 0.0954804
2 0.565625 0.0268509 0.0040625 0.0546296 

我可能不得不将其更改为

2 0.649489 0.666668 0.0625 0.260877
4 0.89485 0.445085 0.0428084 0.084259
4 0.80625 0.508509 0.0469892 0.005556
7 0.529068 0.0906668 0.0582908 0.0954804
7 0.565625 0.0268509 0.0040625 0.0546296  

并且这应该同时发生在所有元素上 仅在第一列 (不是一个接一个地替换,因为那样会错误地索引它)

我基本上会有一个映射{old_class_1:new_class_1,old_class_2:new_class_2,old_class_3:new_class_3}等等...

我查看了 post ,但它不适用于我的情况,因为这些答案中描述的方法会将所有值更改为最后一次替换。

我也调查了这个 post,但我不确定这里的答案是否适用于我的案例,因为我有大约 25 类,所以索引(值第一列)的范围可以从 0-24

我知道这可能在 python 中通过逐行读取每个文件并进行替换来完成,只是想知道是否有更快的方法

如有任何帮助,我们将不胜感激。谢谢!

下面是一个简单示例,说明如何将第一列中的标签映射到不同的标签。

这将映射指定为变量;您同样可以在文件中或其他完全指定它。主要的考虑是你需要有明确的分隔符,并且使用一种对 Awk 来说解析起来不是不必要的困难的格式。

awk 'BEGIN { n = split("0:2 1:4 2:7", m);
    for(i=1; i<=n; ++i) { split(m[i], p); map[p[1]] = p[2] } }
 in map {  = map[] }1' file

BEGIN字段可以简化,但我想让它更容易更新;现在您所要做的就是更新第一个 split 的第一个参数的字符串,以指定不同的映射。我们用了一堆临时变量来将值解析为关联数组 map,这是主脚本随后使用的内容。

最后的1不是错字; “无条件打印每一行”是标准的 Awk 习惯用法。