Como obter a segunda coluna da saída do comando?

2

A saída do meu comando é algo como:

                                   N O D E   O U T P U T

THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT

   NODE FOOT-   NT11     
        NOTE

      3       20.00     
     11       20.00     
   1003       23.75     
   1011       23.75     
   2003       27.52     
   2011       27.52     
   3003       31.30     
   3011       31.30     
   4003       35.08     
   4011       35.08     
   5003       38.87     
   5011       38.87     
   6003       42.67     
   6011       42.67     
   7003       46.48     
   7011       46.48     
   8003       50.29     
   8011       50.29     
   9003       54.12     
   9011       54.12     
  10003       57.95     
  10011       57.95     
  11003       61.79     
  11011       61.79     
  12003       65.64     
  12011       65.64     
  13003       69.50     
  13011       69.50     
  14003       73.37     
  14011       73.37     
  15003       77.25     
  15011       77.25     
  16003       81.14

A primeira coluna é sempre um número. Meu objetivo é obter apenas a segunda coluna, como:

20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
.
.

Eu pretendia usar

# gawk -f nset_output.awk electric_thermal.dat
BEGIN{
}
{
               if($12~/NSET_OUTPUT/ ){
                   for(i=1;i <= 5; i++){
                       getline
                   }
                   x=$2

        print x >"nset_output.dat"

    }       

}

para conseguir isso.mas a saída está desarrumada: (apenas um valor 20.00) 20,00

Então, como obtenho o valor da segunda coluna? (no meu caso eu tenho 405 linhas correspondendo 405 valores com 1 coluna)

    
por Ngô Tiến Hoàng 03.08.2016 / 15:09

6 respostas

0

Podemos testar para ver se o primeiro campo começa com um número e apenas imprime o segundo

awk '$1 ~ /^[0-9][0-9]*$/ { print $2}' electric_thermal.dat > nset_output.dat

Isso corresponde ao seu arquivo de origem e retorna

20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
....
    
por 03.08.2016 / 15:23
0

awk é seu amigo:

awk '$1 ~ /^[[:digit:]]+$/{print $2}' electric_thermal.dat >outfile

deve fazer isso

    
por 03.08.2016 / 15:27
0

Supondo que seja suficiente verificar um dígito na primeira coluna:

awk '$1 ~ /[0-9]/ { print $2 }' data.in >data.out

Para garantir que isso seja aplicado somente às linhas após a linha NSET_OUTPUT , você pode fazer algo como o seguinte:

sed '1,/NSET_OUTPUT/d' data.in | awk '$1 ~ /[0-9]/ { print $2 }' >data.out

Isso excluirá as linhas antes de NSET_OUTPUT e enviará o restante para o script awk .

Seu script produzirá apenas um número, uma vez que, para cada linha de entrada , procurará NSET_OUTPUT e, se encontrado, pular cinco linhas antes de buscar o número da segunda coluna. / p>

O seguinte é uma versão fixa do seu script:

BEGIN { print_values = 0 }

$12 ~ /NSET_OUTPUT/ {
    for (i = 1; i <= 5; i++) {
        getline;
    }

    print_values = 1;
}

print_values == 1 {
    x = $2;
    print x >"nset_output.dat"
}
    
por 03.08.2016 / 15:26
0

Comando

 awk '$1 ~ /^[0-9]*$/{print $2}' file name


output
20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
35.08
35.08
38.87
38.87
42.67
42.67
46.48
46.48
50.29
50.29
54.12
54.12
57.95
57.95
61.79
61.79
65.64
65.64
69.50
69.50
73.37
73.37
77.25
77.25
81.14
    
por 07.06.2018 / 04:06
-1

Se as 7 linhas acima forem persistentes depois de executar o comando todas as vezes, use:

yourcommand | sed 1,7d | awk '{print $2}'

sed 1,7d simplesmente ocultará as primeiras 7 linhas, que você não precisa. awk irá classificar o conteúdo exato que você está procurando ...

cat yourcommand_out | sed 1,7d | awk '{print $2}'
20.00
20.00
23.75
23.75
27.52
27.52
31.30
31.30
35.08
35.08
38.87
38.87
42.67
42.67
46.48
46.48
50.29
50.29
54.12
54.12
57.95
57.95
61.79
61.79
65.64
65.64
69.50
69.50
73.37
73.37
77.25
77.25
81.14
    
por 03.08.2016 / 16:24
-2

Tente isto:

awk '/^[ ]*[[:digit:]]/ {print $2}' inputFile
    
por 03.08.2016 / 18:40

Tags