Hvordan får jeg den anden kolonne fra kommandooutput?

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

  • Hvis overskriften er af fast længde, kan du fjerne det med bare tail og derefter awk 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.

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]+ coz first 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 fra electric_thermal.dat
  • Hmm ,,, jeg overså kommentaren i scriptet. Tak. Med hensyn til + Jeg havde aldrig et problem med at bruge dem med gnu/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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *