Ieșirea comenzii mele este ceva de genul:
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
Prima coloană este întotdeauna un număr, scopul meu este să obțin doar a doua coloană, cum ar fi:
20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . .
Am intenționat să folosesc
# 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" } }
pentru a realiza acest lucru.dar, ieșirea este încurcată: (o singură valoare 20,00) 20,00
Deci, Cum obțin valoarea celei de-a doua coloane? (în cazul meu am 405 de rânduri corespunzătoare a 405 de valori cu 1 coloană)
Comentarii
Răspuns
Presupunând că este suficient pentru a verifica o cifră în prima coloană:
awk "$1 ~ /[0-9]/ { print $2 }" data.in >data.out
Pentru a vă asigura că acest lucru se aplică numai liniilor după linia NSET_OUTPUT
, puteți face ceva de genul următor:
sed "1,/NSET_OUTPUT/d" data.in | awk "$1 ~ /[0-9]/ { print $2 }" >data.out
Aceasta va șterge liniile înainte de NSET_OUTPUT
și va trimite restul la scriptul awk
.
Scriptul dvs. va afișa doar un număr, deoarece acesta, pentru fiecare linie de intrare , va căuta NSET_OUTPUT
și, dacă este găsit, săriți cinci rânduri înainte de a prelua numărul din a doua coloană.
Următoarea este o versiune fixă a scriptului dvs. :
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" }
Comentarii
- Ținând cont că ieșirea comenzii are un antet (vezi revizuirea întrebării) care poate conține lucruri precum
3G
regex-ul tău trebuie să fie mai strict pentru a filtra astfel de valori - @sjsam Not destul sigur că îl văd pe mine (examinând reviziile), dar am ' totuși am actualizat răspunsul (într-un mod care îl face diferit de al tău și Stephen ' s).
Răspuns
Putem testa pentru a vedea dacă primul câmp începe cu un număr și pur și simplu tipăriți al doilea
awk "$1 ~ /^[0-9][0-9]*$/ { print $2}" electric_thermal.dat > nset_output.dat
Acest lucru se potrivește cu fișierul dvs. sursă și returnează
20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 ....
Comentarii
- De ce nu
[0-9]+
cozfirst column is always a number
? De asemenea, clar intrarea provine dintr-o comandă, deci ar trebui să fie canalizată - Nu toate versiunile
awk
acceptă+
sintaxă. Întrebarea a spus că datele provin de laelectric_thermal.dat
- Hmm ,,, am trecut cu vederea comentariul din script. Mulțumiri. În ceea ce privește
+
nu am avut niciodată o problemă cu ajutorul lor cugnu/non-gnu awks
La ce versiune v-ați referit? - Sisteme vechi vechi 🙂
Răspuns
awk
este prietenul tău:
awk "$1 ~ /^[[:digit:]]+$/{print $2}" electric_thermal.dat >outfile
ar trebui să o facă
Răspunde
Comandă
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
Răspuns
Dacă cele 7 linii de mai sus sunt persistente după executarea comenzii de fiecare dată, utilizați:
yourcommand | sed 1,7d | awk "{print $2}"
sed 1,7d
va ascunde pur și simplu primele 7 rânduri, de care nu aveți nevoie . awk
va sorta conținutul exact pe care îl căutați efectiv …
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
Comentarii
- Vot negativ: inutil [ utilizarea cat ] , iar soluția nu ' nu satisface y cerințele. De asemenea, vă rugăm să formatați codul.
Răspuns
Încercați acest lucru:
awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile
Comentarii
- Vă rugăm să învățați să utilizați blocuri de cod.
tail
, apoiawk
pentru cealaltă coloană. ' sugerez să aveți grijă la codul de indentare, fragmentul din întrebare este destul de greu de interpretat, deoarece indentarea și parantezele nu se potrivesc.