用映射中的值替换第一个字段
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 习惯用法。
我在 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 习惯用法。