Estou tentando imprimir linhas que possuem uma string correspondente, mas também gostaria de imprimir "NA" para as outras linhas

Estou tentando imprimir linhas que possuem uma string correspondente, mas também gostaria de imprimir "NA" para as outras linhas

Eu tenho um arquivo parecido com este:

Volume1  
created=Monday  
blah blah  
foo foo  
lock mode=exclusive  
ops  
layer id=1  

Volume2  
created=Tuesday  
jibber jabber  
foo foo  
ops  
layer id=2  

Volume3  
created=Wednesday  
blaaah  
foooo  
lock mode=shared  
ops  
layer id=3

O que eu gostaria de fazer é usar o grep no "modo de bloqueio" e, se houver, imprimir a linha inteira, caso contrário, gostaria de imprimir "NA". Não consigo descobrir como imprimir algo para linhas não correspondentes. Tenho certeza que awk ou sed também poderiam fazer isso.

Tenho tentado um código semelhante a:

grep -A6 Volume | grep "lock mode" <file>

Gostaria que a saída mostrasse o seguinte, para este exemplo:

lock mode=exclusive  
NA  
lock mode=shared

Responder1

É fácil com perl:

perl -l -00 -ne 'print /lock mode.*/ ? $& : "NA"'
  • -ldefine o delimitador do campo de saída para nova linha
  • -00: modo parágrafo (os registros são parágrafos)
  • -ne code: executa o código para cada registro de entrada
  • se o registro contiver lock modeseguido por qualquer número de caracteres que não sejam de nova linha, imprima o que corresponde ( $&) ou NAnão.

Basicamente o mesmo queSolução estranha de @iruvar, mas em perl.

Responder2

Com awkno modo parágrafo

awk -v RS= '{match($0, /lock mode=[^\n]+/); 
  print RSTART? substr($0, RSTART, RLENGTH): "NA"}' file

Isso RS=faz com que cada parágrafo seja tratado como um único registro. A chamada paracorresponderpreenche as coordenadas de lock mode=....em variáveis ​​predefinidas RSTARTe RLENGTH. Se RSTARTfor diferente de zero, a substring correspondente a RSTARTe RLENGTHé impressa, caso contrário, NAé impressa

Responder3

Com GNUsed

sed -n '
    /Volume/!d
    :a
    n
    /lock mode/{
        p
        d
        }
    /^\s*$/!ba
    c\NA
    ' <file>

Comestranho

awk '
    BEGIN{
        FS="\n"
        RS="\n\n"
    }
    /lock mode/{
        for(i=1;i<=NF;i++)
            if($i ~ /lock mode/)
                print $i
        next
    }
    {
        print "NA"
    }
    ' <file>

informação relacionada