awk imprimir uma partida somente se o último registro antes de outra partida

0

Eu quero usar o awk para imprimir uma correspondência de algum padrão, somente se for a última linha do arquivo antes de um texto constante.

Por exemplo, eu quero imprimir o valor de "c" somente se for a última linha antes de algum texto constante:

cat file.txt:
a=1
b=2
c=3
...constant text...

imprimir 3.

cat file.txt:
a=1
c=3
b=2
...constant text...

não imprima nada.

Como faço isso ..? Como pode o awk saber se é o último número do arquivo?

    
por csny 09.02.2015 / 18:46

3 respostas

3

I want to use awk for printing a match of some pattern, only if it is the last line of the file before some constant text.

Nesse caso, tente isto:

awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file

Exemplos

$ cat file1 
a=1
b=2
c=3
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file1
3
$ cat file2
a=1
c=3
b=2
...constant text...
$ awk -F= '/constant text/ && name=="c"{print value} {name=$1;value=$2}' file2
$ 

Como funciona

  • -F=

    Isso diz awk para usar = como o separador de campo. Dessa forma, podemos separar o nome e o valor de campos como a=1 ou c=3 .

  • /constant text/ && name=="c"{print value}

    Se chegarmos a uma linha com constant text e name (como a última definida na linha anterior) será c e, em seguida, imprimir value .

  • name=$1;value=$2

    Para a linha atual, salve o primeiro campo como name e o segundo campo como value .

por 09.02.2015 / 19:14
1

Se você não se importar em usar o grep, ele terá a opção de imprimir linhas antes da correspondência.

A opção é: -B num, --before-context = num

No seu caso:

cat file.txt|grep -B 1 "constant text"|grep "c="|cut -f2 -d'='

Explicação:

  1. Imprima apenas a linha antes do texto constante.
  2. Filtre todos os valores c da saída.
  3. Extrair o segundo campo com o delimitador '='.
por 24.11.2017 / 05:42
0

Alguns googling acharam a melhor resposta até agora, embora eu já tenha uma resposta: usar tac torna tudo muito mais simples ...

tac file | awk 'NR==2{if ( $1=="c") print $2}'

O número da linha é um após o "texto constante". Se o "texto constante" for uma linha - NR==2 . Se forem duas linhas - NR==3 . Ainda não decidi qual formato deve ser o texto constante ...

    
por 10.02.2015 / 11:11

Tags