используя awk и gensub для удаления части в строке, заканчивающейся на «символ + число + S» - PullRequest
0 голосов
/ 08 октября 2018

Моя цель - убрать конец «1С», а также букву непосредственно перед ним, в данном случае «М».Как мне этого добиться?Мой нерабочий код:

echo "14M3856N61M1S" | gawk '{gensub(/([^(1S)]*)[a-zA-Z](1S$)/, "\\1", "g") ; print $0}'
>14M3856N61M1S

Желаемые результаты должны быть

>14M3856N61

Некоторая дополнительная информация здесь.1. Я не думаю, что substr будет работать здесь, так как мои фактические целевые строки будут иметь различную длину.2. Я предпочитаю не использовать подход определения специального разделителя, потому что это будет использоваться вместе с «если» как часть условной операции awk, в то время как разделитель уже определен глобально.Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

РЕДАКТИРОВАТЬ: В соответствии с комментарием OP я добавляю решения, где OP может получить результат в переменную bash тоже следующим образом.

var=$(echo "14M3856N61M1S" | awk 'match($0,/[a-zA-Z]1S$/){print substr($0,1,RSTART-1)}' )
echo "$var"
14M3856N61


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

echo "14M3856N61M1S" | awk 'match($0,/[a-zA-Z]1S$/){$0=substr($0,1,RSTART-1)} 1'
14M3856N61

Объяснение вышеуказанной команды:

echo "14M3856N61M1S" |        ##printing sample string value by echo command here and using |(pipe) for sending standard ouptut of it as standard input to awk command.
awk '                         ##Starting awk command here.
  match($0,/[a-zA-Z]1S$/){    ##using match keyword of awk here to match 1S at last of the line along with an alphabet(small or capital) before it too.
   $0=substr($0,1,RSTART-1)   ##If match found in above command then re-creating current line and keeping its value from 1 to till RSTART-1 value where RSTART and RLENGTH values are set by match out of the box variables by awk.
  }                           ##Closing match block here.
1'                            ##Mentioning 1 will print the edited/non-edited values of lines here.
0 голосов
/ 08 октября 2018
echo "14M3856N61M1S" | awk -F '.1S$' '{print $1}'

Выход:

14M3856N61
0 голосов
/ 08 октября 2018

Почему бы не использовать простую подстановку, чтобы сопоставить 1S в конце и сопоставить любой символ перед ним?

echo "14M3856N61M1S" | awk '{sub(/[[:alnum:]]{1}1S$/,"")}1'
14M3856N61M1S

Здесь [[:alnum:]] соответствует классу символов POSIX для сопоставления буквенно-цифровых символов (цифри алфавиты) и {1} представляют совпадать только с одним.Или, если вы уверены, что перед шаблоном 1S может возникнуть только characters, замените [[:alnum:]] на [[:alpha:]].

Чтобы ответить на вопрос OP, чтобы поместить результат сопоставления в отдельную переменную, используйте match() as sub() не возвращает замещенную строку, а только количество выполненных замен.

echo "14M3856N61M1S" | awk 'match($0,/[[:alnum:]]{1}1S$/){str=substr($0,1,RSTART-1); print str}'
...