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
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]+
cozfirst 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 deelectric_thermal.dat
- Hmm ,,, esqueci o comentário no script. Obrigado. Em relação a
+
, nunca tive problemas para usar com eles comgnu/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.
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.