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
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]+
cozfirst 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 daelectric_thermal.dat
- Hmm ,,, ho trascurato il commento nello script. Grazie. Per quanto riguarda
+
non ho mai avuto problemi a utilizzarli congnu/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.
tail
, quindiawk
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.