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

2024-06-26 13:27:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个文件:

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

我需要将两个直接相邻的数字之间的空格替换为零(例如,将第二列1131和第三列411之间的间隙替换为0),这将返回所需的输出,例如:

KALI P   131104113008.580
IMOB P   131104113001.863

当我说两个相邻的数字之间的空格时,意味着两个数字之间只有一个空格,我想用零来代替这个空格

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

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

但不幸的是,该文件包含数千行,随着数字序列的变化,逐个查看列的每个块会变得很痛苦

我的解决方法是迭代一系列字符串,将它们存储在变量或数组中,检查是否存在包含空格的元素并返回其索引,然后使用该“空格”索引作为引用检查相邻元素是否为数字,然后用零替换这个空间,如果它确实有数字邻居。然而,我不知道它在bashawk中是否可行。我对Python有更好的理解,但不知何故,这个空白对我来说是一个障碍;Python可能会将此空格识别为分隔符

有没有办法优雅地解决这个问题


Tags: 文件元素数字myfiletmp空格awkme37
2条回答

您可以将一个简单的sed正则表达式与两个捕获组一起使用,这些捕获组与由单个空格分隔的数字相匹配:

sed -E 's/([0-9]) ([0-9])/\10\2/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,$2)} 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

相关问题 更多 >