перейти к определенной строке в awk, чтобы начать обработку [закрыто]

Debian tiene páginas web de listas de paquetes bastante buenas en packages.debian.org , incluidas listas de metapaquetes. Por ejemplo,aquí está la lista de metapaquetes para Debian 9.

También debe consultar losmetapaquetes de tareas , definidos como conjuntos de paquetes para roles de servidor específicos o configuraciones de GUI para idiomas específicos.

2
09.05.2019, 12:05
2 ответа

если я правильно понял :-в вашем вводе есть выделенная строка с надписью «<START of block>» и еще одна для «<END of block>», и вы хотите напечатать этот блок (, включая эти 2 маркера? или нет? )если они оканчиваются на «You» в строке перед «<END of block>»?

, затем:

awk -v regstart="<START of block>" -v regend="<END of block>" -v reglast="You" '
 BEGIN { rem="we will remember a block between those regstart and regend markers, and only print it if the last line matches reglast"
         remember=0; rem="by default we are not inside a block, so we do not remember lines until we match the regstart"
 }

 ( $0 ~ regstart ) {
     remember=1; nb=0; 
 }

 ( remember==1 )   {
     line[++nb]=$0 ; 
 }

 ( $0 ~ regend   ) { 
     remember=0; rem="we reached the end of block, we do not remember anymore the lines we see until next regstart"
     if ( line[(nb-1)] ~ reglast ) {
          ## for(i=2;i<=(nb-1);i++) { rem="this version do NOT show the 2 marker lines"
          for(i=1;i<=nb;i++) { rem="this version shows the 2 marker lines"
              print line[i]
          }
          ## print "" ; rem="uncomment this line if you want a separator lines between blocks"
     }
 }

'

Примечание1 :Я использую регулярные выражения для сопоставления начала, конца и последней строки, но вместо этого можно использовать "==" для сравнения точных строк.

Примечание 2 :часть печати :может измениться с 2 на nb -1, чтобы не отображать НАЧАЛО (, хранящееся в строке [1] )и КОНЕЦ (, хранящееся в строке [nb ] )строк.

Примечание3 :приведенный выше скрипт успешно обрабатывает все блоки и печатает только те, которые заканчиваются строкой, соответствующей "reglast". Т.е. печатает не один, а все совпадающие блоки.

0
27.01.2020, 22:27

Более короткий awkвариант для входа ниже:

< infile awk -v RS='\n<END of block>' '$NF == "You" { print $0 RS }'
<START of block>
Hi
How
Are
You
<END of block>

<START of block>
thank
You
<END of block>

$NFздесь (в соответствии с определеннымRS(разделителем записей )для статической строки, которая заставляет нас разделять каждый блок на основе этого )указывает значение последней строки, поэтому, если оно равно Yesстрока, затем распечатайте этот блок и также верните обратно RS.

Входной файл:

<START of block>
Hi
How
Are
You
<END of block>
<START of block>
Hi
How
Are
not YOU
<END of block>
<START of block>
thank
You
<END of block>
<START of block>
welcome
to
Unix
<END of block>
0
27.01.2020, 22:27

Теги

Похожие вопросы