遍历一系列字符串并用零替换两个数字之间的空格
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 替换为零。但是,我不知道在 bash
或 awk
中是否可行。我对 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
我有这样一个文件:
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 替换为零。但是,我不知道在 bash
或 awk
中是否可行。我对 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