Come ottenere la seconda colonna dalloutput del comando?

Loutput del mio comando è qualcosa del tipo:

 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 prima colonna è sempre un numero, il mio scopo è ottenere solo la seconda colonna, ad esempio:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Volevo usare

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

per ottenere ciò. ma loutput è incasinato: (solo un valore 20.00) 20.00

Allora, come ottengo il valore della seconda colonna? (nel mio caso ho 405 righe corrispondenti a 405 valori con 1 colonna)

Commenti

  • Se lintestazione è di lunghezza fissa, puoi rimuoverla con solo tail, quindi awk per laltra colonna. ' suggerirei di prestare attenzione al rientro del codice, lo snippet nella domanda è piuttosto difficile da interpretare poiché il rientro e le parentesi graffe non corrispondono.

Risposta

Supponendo che “sia sufficiente controllare una cifra nella prima colonna:

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

Per assicurarti che questo venga applicato solo alle righe dopo la riga NSET_OUTPUT, potresti fare qualcosa di simile:

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

Questo eliminerà le righe prima di NSET_OUTPUT e invierà il resto allo script awk.


Il tuo script produrrà un solo numero poiché per ogni riga di input cercherà NSET_OUTPUT e, se trovato, salta cinque righe prima di recuperare il numero dalla seconda colonna.

Quella che segue è una versione fissa del tuo 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" } 

Commenti

  • Da tenere presente che loutput del comando ha unintestazione (vedi la revisione della domanda) che può contenere cose come 3G la tua espressione regolare deve essere più rigorosa per filtrare tali valori
  • @sjsam Not abbastanza sono sicuro di vederlo io stesso (esaminando le revisioni), ma ' ho comunque aggiornato la risposta (in un modo che la rende diversa dalla tua e Stephen ' s).

Risposta

Possiamo testare per vedere se il primo campo inizia con un numero e stampa semplicemente il secondo

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

Questo corrisponde al tuo file sorgente e restituisce

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

Commenti

  • Perché no [0-9]+ coz first column is always a number? Inoltre, chiaramente linput proviene da un comando, quindi dovrebbe essere reindirizzato
  • Non tutte le versioni di awk supportano + sintassi. La domanda diceva che i dati provenivano da electric_thermal.dat
  • Hmm ,,, ho trascurato il commento nello script. Grazie. Per quanto riguarda + non ho mai avuto problemi a utilizzarli con gnu/non-gnu awks Quale versione intendevi?
  • Vecchi vecchi sistemi 🙂

Risposta

awk è tuo amico:

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

dovrebbe farlo

Risposta

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 

Risposta

Se le 7 righe precedenti sono persistenti dopo aver eseguito il comando ogni volta, usa:

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

sed 1,7d nasconderà semplicemente le prime 7 righe, che non ti servono . awk selezionerà il contenuto esatto che stai effettivamente cercando …

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 

Commenti

  • Downvote: Useless [ uso di cat ] e la soluzione non ' t soddisfa y i requisiti. Inoltre, formatta il codice.

Risposta

Prova questo:

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

Commenti

  • Impara a usare i blocchi di codice.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *