Sed / Awk: как вставить текст в шаблон серии в линию - PullRequest
0 голосов
/ 23 мая 2019

необходимо вставить '\ N' между двумя последовательными запятыми в строке, как показано ниже:

"abc,,,,5,,,3.2,,"

to:

"abc,\N,\N,\N,5,\N,\N,3.2,\N,"

Кроме того, номер следующей запятойне исправлено, возможно 6, 7 или больше.Нужен гибкий способ справиться с этим.

Не нашел чёткого решения от Google.

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Не могли бы вы попробовать один раз.

awk '{gsub(/\,\,/,",\\N,");gsub(/\,\,/,",\\N,")} 1' Input_file
3 голосов
/ 23 мая 2019

Вы можете просто использовать следующую команду sed:

sed 's/,,/,\\N,/g;s/,,/,\\N,/g;'

Демонстрация:

$ echo 'abc,,,,5,,,3.2,,' | sed 's/,,/,\\N,/g;s/,,/,\\N,/g;s/,,/,\\N,/g'
abc,\N,\N,\N,5,\N,\N,3.2,\N,

Пояснения:

s/,,/,\\N,/g заменит ,, на ,\N, глобально для строки, однако вам нужно будет сделать два прохода в пространстве шаблона, чтобы убедиться, что все замены произошли, давая команды: s/,,/,\\N,/g;s/,,/,\\N,/g;.

Дополнительные примечания:

Чтобы ответить на ваши сомнения относительно гибкости этого подхода, я подготовил следующий входной файл.

$ cat input_comma.txt 
abc,,,,5,,,3.2,,
,,,,,,def,
1,,,,,,1.2
6commas,,,,,,
7commas,,,,,,,

Как видите, не имеет значения, сколько последовательных запятых присутствует во входных данных:

$ sed 's/,,/,\\N,/g;s/,,/,\\N,/g;s/,,/,\\N,/g' input_comma.txt 
abc,\N,\N,\N,5,\N,\N,3.2,\N,
,\N,\N,\N,\N,\N,def,
1,\N,\N,\N,\N,\N,1.2
6commas,\N,\N,\N,\N,\N,
7commas,\N,\N,\N,\N,\N,\N,

При awk аналогичный подход за 2 прохода может быть реализован таким же образом:

$ echo "test,,,mmm,,,,aa,," | awk '{gsub(/\,\,/,",\\N,");gsub(/\,\,/,",\\N,")} 1'
test,\N,\N,mmm,\N,\N,\N,aa,\N,
1 голос
/ 23 мая 2019

С perl:

perl -pe '1 while s/,,/,\\N,/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...