Min kommandos output er noget 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 kolonne er altid et tal, mit formål er kun at få den anden kolonne, som:
20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . .
Jeg havde til hensigt at bruge
# 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 at opnå dette. men output er ødelagt: (kun en værdi 20.00) 20.00
Så hvordan får jeg den anden søjles værdi? (i mit tilfælde har jeg 405 rækker, der svarer til 405-værdier med 1 kolonne)
Kommentarer
Svar
Forudsat at det er nok til at kontrollere et ciffer i første kolonne:
awk "$1 ~ /[0-9]/ { print $2 }" data.in >data.out
For at sikre, at dette kun bliver anvendt på linjer efter NSET_OUTPUT
-linjen, kan du gøre noget i retning af følgende:
sed "1,/NSET_OUTPUT/d" data.in | awk "$1 ~ /[0-9]/ { print $2 }" >data.out
Dette sletter linjer før NSET_OUTPUT
og sender resten til awk
scriptet.
Dit script udsender kun et nummer, da det for hver linje med input vil se efter NSET_OUTPUT
, og hvis det findes, skal du springe fem linjer inden hentning af nummeret fra den anden kolonne.
Følgende er en fast version af dit script:
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 på at kommandooutputtet har et overskrift (se spørgsmålsrevisionen), som kan indeholde ting som
3G
din regex skal være strengere for at filtrere sådanne værdier - @sjsam Ikke ganske sikker på, at jeg selv ser det (kigger gennem revisionerne), men jeg ' har alligevel opdateret svaret (på en måde, der gør det anderledes end dit og Stephen ' s).
Svar
Vi kan teste for at se om det første felt starter med et tal og bare udskrive det andet
awk "$1 ~ /^[0-9][0-9]*$/ { print $2}" electric_thermal.dat > nset_output.dat
Dette matcher din kildefil 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
? Input kommer også tydeligt fra en kommando, så det skal piperes - Ikke alle versioner af
awk
understøtter+
syntaks. Spørgsmålet sagde, at data kom fraelectric_thermal.dat
- Hmm ,,, jeg overså kommentaren i scriptet. Tak. Med hensyn til
+
Jeg havde aldrig et problem med at bruge dem medgnu/non-gnu awks
Hvilken version mente du? - Gamle gamle systemer 🙂
Svar
awk
er din ven:
awk "$1 ~ /^[[:digit:]]+$/{print $2}" electric_thermal.dat >outfile
skal gø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 ovenstående 7 linjer er vedvarende efter udførelse af kommandoen Brug hver gang:
yourcommand | sed 1,7d | awk "{print $2}"
sed 1,7d
skjuler simpelthen de første 7 linjer, som du ikke behøver . awk
sorterer det nøjagtige indhold, du faktisk leder efter …
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: Ubrugelig [ brug af kat ] , og løsningen opfylder ikke ' y kravene. Formatér også koden.
Svar
Prøv dette:
awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile
Kommentarer
- Lær at bruge kodeblokke.
tail
og derefterawk
til den anden kolonne. Jeg ' Jeg foreslår, at du skal være forsigtig med at indrykke kode, uddraget i spørgsmålet er ret svært at fortolke, da indrykket og seler ikke stemmer overens.