Cum se obține a doua coloană din ieșirea comenzii?

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

  • Dacă antetul are o lungime fixă, îl puteți elimina cu doar tail, apoi awk 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.

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]+ coz first 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 la electric_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 cu gnu/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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *