Hvordan får jeg den andre kolonnen fra kommandoutput?

Min kommandos utgang er omtrent som:

 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 

Den første kolonnen er alltid et tall, mitt formål er å få bare den andre kolonnen, som:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Jeg hadde tenkt å bruke

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

for å oppnå dette. men utdataene er rotet til: (bare en verdi 20.00) 20.00

Så, hvordan får jeg den andre kolonnens verdi? (i mitt tilfelle har jeg 405 rader tilsvarende 405 verdier med 1 kolonne)

Kommentarer

  • Hvis overskriften er av fast lengde, kan du fjerne den med bare tail, og deretter awk for den andre kolonnen. Jeg ' Jeg foreslår at du er forsiktig med innrykkekoden. Utdraget i spørsmålet er ganske vanskelig å tolke siden innrykk og klammeparenteser ikke stemmer overens.

Svar

Forutsatt at det er nok til å se etter et siffer i første kolonne:

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

For å sikre at dette bare blir brukt på linjer etter NSET_OUTPUT -linjen, kan du gjøre noe sånt som følgende:

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

Dette vil slette linjer før NSET_OUTPUT og sende resten til awk -skriptet.


Skriptet ditt vil bare sende ut ett tall siden det, for hver linje med inngang , vil se etter NSET_OUTPUT, og hvis du finner det, hopp fem linjer før du henter nummeret fra andre kolonne.

Følgende er en fast versjon av ditt skript:

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

Kommentarer

  • Husk at kommandoutgangen har en overskrift (se spørsmålsrevisjonen) som kan inneholde ting som 3G regexen din må være strengere for å filtrere slike verdier
  • @sjsam Ikke ganske sikker på at jeg ser det selv (ser gjennom revisjonene), men jeg ' har likevel oppdatert svaret (på en måte som gjør det annerledes enn ditt og Stephen ' s).

Svar

Vi kan teste for å se om det første feltet starter med et tall og bare skrive ut det andre

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

Dette samsvarer med kildefilen din og returnerer

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

Kommentarer

  • Hvorfor ikke [0-9]+ coz first column is always a number? Inngangen kommer også tydelig fra en kommando, så den skal pipes
  • Ikke alle versjoner av awk støtter + syntaks. Spørsmålet sa at data kom fra electric_thermal.dat
  • Hmm ,,, jeg overså kommentaren i skriptet. Takk. Angående + Jeg hadde aldri problemer med å bruke dem med gnu/non-gnu awks Hvilken versjon mente du?
  • Gamle gamle systemer 🙂

Svar

awk er din venn:

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

skal gjøre det

Svar

Kommando

 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 

Svar

Hvis de ovennevnte 7 linjene er vedvarende etter at kommandoen er utført bruk hver gang:

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

sed 1,7d vil bare skjule de første 7 linjene, som du ikke trenger . awk sorterer ut nøyaktig innholdet du faktisk leter etter …

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 

Kommentarer

  • Downvote: Useless [ bruk av katt ] , og løsningen tilfredsstiller ikke ' y kravene. Formater også koden.

Svar

Prøv dette:

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

Kommentarer

  • Vennligst lær å bruke kodeblokker.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *