awk: как извлечь 2 шаблона из одной строки, а затем объединить их? - PullRequest
1 голос
/ 31 марта 2020

Я хочу найти 2 шаблона в каждой строке, а затем распечатать их с да sh между ними в качестве разделителя. Вот пример строк:

20200323: #5357 BEAR_SPX_X15_NORDNET_D1 {CU=DKK, ES=E, II=DK0061205473, IR=NRB, LN=BEAR SPX X15 NORDNET D1, MIC=FNDK, NS=1, PC=C, SE=193133, SG=250, SN=193133, TK="0.01 to 100,0.05 to 500,0.1", TS=BEAR_SPX_X15_NORDNET_D1, TY=W, UQ=1}
20200323: #5358 BULL_SPX_X10_NORDNET_D2 {CU=DKK, ES=E, II=DK0061205556, IR=NRB, LN=BULL SPX X10 NORDNET D2, MIC=FNDK, NS=1, PC=P, SE=193132, SG=250, SN=193132, TK="0.01 to 100,0.05 to 500,0.1", TS=BULL_SPX_X10_NORDNET_D2, TY=W, UQ=1}
20200323: #5359 BULL_SPX_X12_NORDNET_D2 {CU=DKK, ES=E, II=DK0061205630, IR=NRB, LN=BULL SPX X12 NORDNET D2, MIC=FNDK, NS=1, PC=P, SE=193131, SG=250, SN=193131, TK="0.01 to 100,0.05 to 500,0.1", TS=BULL_SPX_X12_NORDNET_D2, TY=W, UQ=1}

Учитывая приведенные выше строки, мой желаемый вывод после запуска скрипта должен выглядеть следующим образом:

BEAR_SPX_X15_NORDNET_D1 - DK0061205473
BULL_SPX_X10_NORDNET_D2 - DK0061205556
BULL_SPX_X12_NORDNET_D2 - DK0061205630

Первое значение alphanumeri c ( например, BULL_SPX_X12_NORDNET_D2) всегда находится на 3-й позиции строки. Второе значение alphanumeri c (например, DK0061205630) может находиться в разных позициях, но ему всегда предшествует «II =» и всегда точно длина 12 символов.

Я пытался реализовать свою задачу с помощью следующего сценария:

 13 regex='II=.\{12\}'
 14 while IFS="" read -r line; do
 15     matchedString=`grep -o $regex littletest.txt | tr -d 'II=,'`
 16     awk /II=/'{print $3, " - ", $matchedString}' littletest.txt > temp.txt
 17 done <littletest.txt

Мой мыслительный процесс и намерения / предположения:

В строке 13 определяется шаблон регулярного выражения, соответствующий строке alphanumeri c, которой предшествует "II ="

В Строка 15 переменной «matchedString» получает значение, которое извлекается из строки через регулярное выражение, а предыдущий «II =» удаляется.

В строке 16 выражение awk используется для обнаружения всех строк, содержащих «II =». ", а затем выведите третью строку, найденную в каждой строке входного файла, а также выведите значение шаблона сопоставленной строки, который был определен в предыдущей строке скрипта. Поэтому я ожидаю, что в этот момент пара извлеченных шаблонов (например, BEAR_SPX_X15_NORDNET_D1 - DK0061205473) должна быть перенесена в файл temp.txt.

В строке 17 указывается входной файл для сценария, который он может использовать.

Однако после запуска скрипта я не получил желаемого результата. Вот пример того, что я получил:

BEAR_SPX_X15_NORDNET_D1
20200323: #5357 BEAR_SPX_X15_NORDNET_D1 {CU=DKK, ES=E, II=DK0061205473, IR=NRB, LN=BEAR SPX X15 NORDNET D1, MIC=FNDK, NS=1, PC=C, SE=193133, SG=250, SN=193133, TK="0.01 to 100,0.05 to 500,0.1", TS=BEAR_SPX_X15_NORDNET_D1, TY=W, UQ=1}

Как мне достичь желаемого результата, который я описал ранее?

Ответы [ 3 ]

3 голосов
/ 31 марта 2020
$ awk -v OFS=' - ' 'match($0,/II=/){print $3, substr($0,RSTART+3,12)}' file
BEAR_SPX_X15_NORDNET_D1 - DK0061205473
BULL_SPX_X10_NORDNET_D2 - DK0061205556
BULL_SPX_X12_NORDNET_D2 - DK0061205630
1 голос
/ 31 марта 2020

Просто пробую awk.

awk  'BEGIN{ FS="[II=, ]+" ; OFS=" - " } {print $3, $8}' file.txt
0 голосов
/ 31 марта 2020

Используя gawk (gnu awk), который поддерживает регулярное выражение в качестве полевого разделителя (FS), и учитывая, что каждая строка в вашем файле имеет одинаковый формат / одинаковое количество полей, это отлично работает в моих тестах:

awk '{print $3,$9}' FS="[ ]|II=" OFS=" - " file1
#or FS="[[:space:]]+|II=|[,]" if you might have more than one space between fields

Результаты

BEAR_SPX_X15_NORDNET_D1 - DK0061205473
BULL_SPX_X10_NORDNET_D2 - DK0061205556
BULL_SPX_X12_NORDNET_D2 - DK0061205630

Так как часть II= может быть где угодно, этот трюк может также работать со штрафом при разборе файла дважды:

paste -d "-" <(awk '{print $3}' file1) <(awk '/II/{print $2}' RS="[ ]" FS="=|," file1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...