перебрать ряд строк и заменить пробелы между двумя числами нулями - PullRequest
0 голосов
/ 04 марта 2020

У меня есть файл, подобный этому:

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 

но, к сожалению, файл содержит тысячи строк, и по мере изменения ряда чисел становится больно смотреть каждый блок столбца один за другим.

Моя идея решить эту проблему - перебрать ряд строк, сохранить их в переменной или массиве, проверить, существует ли элемент, содержащий пробел, и вернуть его индекс, а затем проверить, является ли соседний элемент числом или нет, используя этот индекс «пустого пространства» в качестве ссылки, а затем замените это пространство на ноль, если оно действительно имеет число 1023 * соседей. Однако я не знаю, выполнимо ли это в bash или awk. Я лучше понимаю Python, но каким-то образом это пустое пространство является препятствием для меня; Python может распознать это пространство как разделитель.

Есть ли способ элегантно решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 04 марта 2020

Вы можете использовать простое регулярное выражение sed с двумя группами захвата, которые соответствуют ди git, разделенным одним пробелом:

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
2 голосов
/ 04 марта 2020
$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...