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

0

Eu tenho um arquivo parecido com isto:

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 é grep no "modo de bloqueio" e, se estiver lá, imprimir toda a linha, caso contrário, eu gostaria de imprimir "NA". Eu não consigo descobrir como imprimir algo para linhas não correspondentes. Tenho certeza que o awk ou o sed também podem fazer isso.

Eu tenho tentado 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
    
por Tyler 16.12.2016 / 21:01

3 respostas

2

Com o GNU sed

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

Com o awk

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>
    
por 16.12.2016 / 21:18
3

É fácil com perl :

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

Basicamente é o mesmo que @ solução awk do iruvar , mas em perl .

    
por 16.12.2016 / 22:25
3

Com awk no modo de parágrafo

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

O RS= faz com que cada parágrafo seja tratado como um único registro. A chamada para correspondência preenche as coordenadas de lock mode=.... em variáveis predefinidas RSTART e RLENGTH . Se RSTART for diferente de zero, a substring correspondente a RSTART e RLENGTH será impressa, caso contrário NA será impresso

    
por 16.12.2016 / 21:27

Tags