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

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 fazer isso. mas, a saída é confusa: (apenas um valor 20,00) 20,00

Então, como faço para obter o valor da segunda coluna? (no meu caso, tenho 405 linhas correspondentes a 405 valores com 1 coluna)

Comentários

  • Se o cabeçalho tiver comprimento fixo, você pode removê-lo com apenas tail e, em seguida, awk para a outra coluna. Eu ' d sugiro tomar algum cuidado ao recuar o código, o snippet em questão é bastante difícil de interpretar, pois o recuo e as chaves não correspondem.

Resposta

Presumindo que seja o suficiente para verificar se há um dígito na primeira coluna:

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

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

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

Isso excluirá as linhas anteriores a 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.

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" } 

Comentários

  • Tendo em mente que a saída do comando tem um cabeçalho (veja a revisão da questão) que pode conter coisas como 3G seu regex precisa ser mais rígido para filtrar tais valores
  • @sjsam Não bastante vejo que eu mesmo (olhando as revisões), mas ' atualizei a resposta mesmo assim (de uma forma que a torna diferente da sua e Stephen ' s).

Resposta

Podemos testar para ver se o primeiro campo começa com um número e apenas imprimir 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 .... 

Comentários

  • Por que não [0-9]+ coz first column is always a number? Também é evidente que a entrada vem de um comando, por isso deve ser canalizada
  • Nem todas as versões de awk suportam o + sintaxe. A pergunta disse que os dados vieram de electric_thermal.dat
  • Hmm ,,, esqueci o comentário no script. Obrigado. Em relação a +, nunca tive problemas para usar com eles com gnu/non-gnu awks Qual versão você quis dizer?
  • Sistemas antigos e antigos 🙂

Resposta

awk é seu amigo:

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

deve fazê-lo

Resposta

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 

Resposta

Se as 7 linhas acima forem persistentes após a execução do comando sempre, use:

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

sed 1,7d irá simplesmente ocultar as primeiras 7 linhas, que você não precisa . awk 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 

Comentários

  • Votar negativamente: inútil [ uso de cat ] , e a solução não ' satisfaz y os requisitos. Além disso, formate o código.

Resposta

Tente isto:

awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile 

Comentários

  • Aprenda a usar blocos de código.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *