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 
3Gregex-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 
awkacceptă+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 awksLa 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, apoiawkpentru 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.