Após alteração de código pequeno, 'awk' imprime cabeçalho e linhas em branco, (não cabeçalho repetido)

1

data-file content:

             k = 0.1667 0.0962 0.0000 (  4922 PWs)   bands (ev):

-7.1689  -7.1043  -6.1682  -6.0658   1.1309   1.5196   3.0894   3.1087
 3.3846   3.7588   4.2143   4.2220   4.3882   4.4011   5.1222   5.6229
 5.9506   6.2078   8.4442   8.8100   8.8150   8.8529   8.9070   9.0070
 9.5911   9.6311  13.5626  14.3720  15.0169  15.2435 
  end1
  end2
  end3

Eu tentei dois comandos awk nesses dados ...

1.

awk -F'=' '/[[:blank:]]k/{w=w""$2}; { print w}' data-file

Saída:

     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :

2.

awk -F'=' '/[[:blank:]]k/{w=w""$2}; { print w;w=""}' data-file

Saída:

0.1667 0.0962 0.0000 (  4922 PWs)   bands (ev):











(Eight newlines are printed after that.)

Com o segundo comando, o padrão pesquisado é impresso apenas uma vez, mas com mais linhas vazias. Mas o primeiro comando o padrão é impresso nove vezes. Qual é a diferença entre os comandos awk : por que imprimiu mais vezes e por que a linha vazia é impressa? Como suprimir a impressão dessas linhas vazias?

    
por Muthu Valli Nayagam 09.06.2016 / 14:41

2 respostas

1

why did it print more times

Seu script awk tem uma ação sem padrão, o que significa que ela será executada para cada linha de entrada. Se você não quiser imprimir o padrão que procura várias vezes, não faça isso .

why the empty line are printed

Porque você imprime w e, em seguida, define w="" . Então você imprime w novamente para cada linha de entrada.

A pergunta ofuscada torna difícil dizer, mas acho que você quer fazer isso:

awk -F'=' '/[[:blank:]]k/{ print $2 }' data-file
    
por 09.06.2016 / 16:07
0

Essas linhas são impressas porque {print w;w=""} acontece todas as vezes, mesmo que não haja nada em w . Se você quiser apenas imprimir as linhas não vazias, você terá que tornar a ação {print...} condicional em w com algum conteúdo.

Convenientemente, awk considera a string vazia como false e todas as strings não vazias como true (" Verdadeiro e falso em awk "). Assim, você pode obter o que precisa adicionando w como padrão:

awk -F'=' '/[[:blank:]]k/{w=w""$2}; w { print w;w=""}'
    
por 10.06.2016 / 00:46

Tags