Вставьте 1 после элементов без подсчета - PullRequest
1 голос
/ 09 мая 2019

У меня есть файл с такой структурой:

NH3O
CH4
CHN
C2NOPH3

Я пытался сделать 1 как число между двумя буквами или в конце элемента.Таким образом, желаемый результат:

NH3O1
C1H4
C1H1N1
C2N1O1P1H3

До сих пор я пробовал что-то вроде sed -e 's/\([A-Z]\)\([A-Z]\)/\11\2/g' -e 's/\([A-Z]\)[[:blank:]]/\11/g', но это не сработало.

Спасибо за любые советы

Ответы [ 2 ]

2 голосов
/ 09 мая 2019
  • [[:blank:]] не соответствует концу строки, но $ соответствует,
  • вместо указания флага g, реализуйте цикл с использованием ветвления и управления потоком , поскольку при g sed не выполняет подстановку ранее замещенной части (т. Е. Каждый второй символ будет оставаться без изменений),
  • также обрабатывает символы, длина которых превышает один символ (т. Е. Соответствует нижнему регистру).символы после заглавных),
  • в настоящее время не так уж и много нужно, но соблюдение стандарта POSIX и отказ от специфических функций реализации сделают ваш сценарий более переносимым.
sed -e ':1' -e 's/\([[:upper:]][[:lower:]]*\)\([[:upper:]]\|$\)/\11\2/' -e 't1'
1 голос
/ 09 мая 2019

Не могли бы вы попробовать следующее, написанное и протестированное с GNU awk.

awk '{num=split($0,array,"");for(i=1;i<=num;i++){if(array[i]~/^[a-zA-Z]*[a-zA-Z]/ && (array[i]+1)~/^[a-zA-Z]*/){array[i]=array[i]"|"};val=val array[i]};print val;val=""}' Input_file

Добавление здесь формы решения не с одним вкладышем.

awk '
{
  num=split($0,array,"")
  for(i=1;i<=num;i++){
    if(array[i]~/^[a-zA-Z]*[a-zA-Z]/ && (array[i]+1)~/^[a-zA-Z]*/){
      array[i]=array[i]"|"
    }
    val=val array[i]
  }
  print val
  val=""
}
'   Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...