遍历一系列字符串并用零替换两个数字之间的空格

iterate over a series of strings and replace spaces between two numbers with zeros

我有这样一个文件:

ME45 P   1311 41130 1.253
ME39 P   1311 41130 7.700
ME38 P   1311 41130 7.776
ME37 P   1311 41130 8.285
ME36 P   1311 41130 8.689
ME30 P   1311 4113010.252
ME26 P   1311 4113010.486
ME29 P   1311 41130 9.598
ME28 P   1311 41130 9.356
ME21 P   1311 41130 9.911
ME20 P   1311 4113010.465
ME17 P   1311 4113010.984

我需要用零替换两个直接相邻数字之间的 space (例如,替换第二列 1131 和第三列 [=14 之间的间隙) =] 与 0),这将 return 我想要的输出,例如:

KALI P   131104113008.580
IMOB P   131104113001.863

当我说两个直接相邻数字之间的space时,意味着两个数字之间只有一个space,我想用零替换这个space。

到目前为止,我一直在使用 awk 来尝试解决这个问题:

awk '{gsub("1311 41130", "1311041130")}1' myfile > myfile_tmp && mv myfile_tmp myfile 

但不幸的是,该文件包含数千行,并且随着数字系列的变化,逐一查看每一列的块变得很痛苦。

我解决这个问题的想法是遍历一系列字符串,将它们存储在变量或数组中,检查是否存在包含空白 space 的元素及其索引 return,然后通过使用此 "blank space" 索引作为参考来检查相邻元素是否为数字,如果确实有数字邻居,则将此 space 替换为零。但是,我不知道在 bashawk 中是否可行。我对 Python 有了更好的理解,但是这个空白的 space 不知何故对我来说是一个障碍; Python 可能会将此 space 识别为分隔符。

有什么办法可以优雅的解决这个问题吗?

您可以使用带有 2 个捕获组的简单 sed 正则表达式,匹配由单个 space:

分隔的数字
sed -E 's/([0-9]) ([0-9])//g' file

ME45 P   131104113001.253
ME39 P   131104113007.700
ME38 P   131104113007.776
ME37 P   131104113008.285
ME36 P   131104113008.689
ME30 P   131104113010.252
ME26 P   131104113010.486
ME29 P   131104113009.598
ME28 P   131104113009.356
ME21 P   131104113009.911
ME20 P   131104113010.465
ME17 P   131104113010.984
$ awk 'BEGIN{FS=OFS="   "} {gsub(/ /,0,)} 1' file
ME45 P   131104113001.253
ME39 P   131104113007.700
ME38 P   131104113007.776
ME37 P   131104113008.285
ME36 P   131104113008.689
ME30 P   131104113010.252
ME26 P   131104113010.486
ME29 P   131104113009.598
ME28 P   131104113009.356
ME21 P   131104113009.911
ME20 P   131104113010.465
ME17 P   131104113010.984