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
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]+
cozfirst 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 fraelectric_thermal.dat
- Hmm ,,, jeg overså kommentaren i skriptet. Takk. Angående
+
Jeg hadde aldri problemer med å bruke dem medgnu/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.
tail
, og deretterawk
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.