¿Cómo obtener la segunda columna de la salida del comando?

La salida de mi comando es 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 

La primera columna es siempre un número. Mi propósito es obtener solo la segunda columna, como:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Tenía la intención de 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 lograr esto. pero, la salida está desordenada: (solo un valor 20.00) 20.00

Entonces, ¿cómo obtengo el valor de la segunda columna? (en mi caso, tengo 405 filas que corresponden a 405 valores con 1 columna)

Comentarios

  • Si el encabezado es de longitud fija, puede eliminarlo con solo tail, y luego awk para la otra columna. Yo ' sugiero tener cuidado al sangrar el código, el fragmento de la pregunta es bastante difícil de interpretar ya que la sangría y las llaves no coinciden.

Respuesta

Suponiendo que sea suficiente para buscar un dígito en la primera columna:

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

Para asegurarse de que esto solo se aplique a las líneas después de la línea NSET_OUTPUT, puede hacer algo como lo siguiente:

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

Esto eliminará las líneas antes de NSET_OUTPUT y enviará el resto al script awk.


Su secuencia de comandos solo generará un número ya que, por cada línea de entrada , buscará NSET_OUTPUT y, si se encuentra, omitirá cinco líneas antes de obtener el número de la segunda columna.

La siguiente es una versión fija de su 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" } 

Comentarios

  • Teniendo en cuenta que la salida del comando tiene un encabezado (ver la revisión de la pregunta) que puede contener cosas como 3G su expresión regular debe ser más estricta para filtrar dichos valores
  • @sjsam No bastante seguro de que lo veo yo mismo (mirando las revisiones), pero ' he actualizado la respuesta de todos modos (de una manera que la hace diferente a la suya y Stephen ' s).

Responder

Podemos probar para ver si el primer campo comienza con un número y simplemente imprima el segundo

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

Esto coincide con su archivo fuente y devuelve

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 .... 

Comentarios

  • Por qué no [0-9]+ coz first column is always a number? También es evidente que la entrada proviene de un comando, por lo que debe enviarse
  • No todas las versiones de awk admiten + sintaxis. La pregunta decía que los datos provenían de electric_thermal.dat
  • Hmm ,,, Pasé por alto el comentario en el script. Gracias. Con respecto a +, nunca tuve problemas para usarlos con gnu/non-gnu awks ¿A qué versión se refería?
  • Sistemas antiguos 🙂

Respuesta

awk es tu amigo:

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

debería hacerlo

Responder

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 

Responder

Si las 7 líneas anteriores persisten después de ejecutar el comando cada vez, use:

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

sed 1,7d simplemente ocultará las primeras 7 líneas, que no necesita . awk clasificará el contenido exacto que estás buscando …

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 

Comentarios

  • Downvote: Inútil [ uso de cat ] , y la solución no ' satisface y los requisitos. También formatee el código.

Respuesta

Intente esto:

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

Comentarios

  • Aprenda a utilizar bloques de código.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *