Hur får jag den andra kolumnen från kommandoutput?

Mitt kommandos utdata är ungefär 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örsta kolumnen är alltid ett nummer, mitt syfte är att bara få den andra kolumnen, som:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Jag tänkte använda

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

för att åstadkomma detta. men utdata är trasslat: (endast ett värde 20.00) 20.00

Så, hur får jag värdet för den andra kolumnen? (i mitt fall har jag 405 rader som motsvarar 405 värden med en kolumn)

Kommentarer

  • Om rubriken är av fast längd kan du ta bort den med bara tail och sedan awk för den andra kolumnen. Jag ' Jag föreslår att du tar lite försiktighet när du drar in kod, utdraget i frågan är ganska svårtolkat eftersom indraget och hängslen inte matchar.

Svar

Förutsatt att det räcker för att söka efter en siffra i den första kolumnen:

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

För att säkerställa att detta bara tillämpas på rader efter NSET_OUTPUT raden kan du göra något av följande:

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

Detta raderar rader före NSET_OUTPUT och skickar resten till awk -skriptet.


Ditt skript matar bara ut ett nummer eftersom det, för varje ingångsrad , letar efter NSET_OUTPUT, och om det hittas, hoppa över fem rader innan du hämtar numret från den andra kolumnen.

Följande är en fast version 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

  • Med tanke på det att kommandoutgången har ett sidhuvud (se frågan revision) som kan innehålla saker som 3G din regex måste vara strängare för att filtrera sådana värden
  • @sjsam Inte ganska säker på att jag ser det själv (tittar igenom versionerna), men jag ' har ändå uppdaterat svaret (på ett sätt som gör det annorlunda än ditt och Stephen ' s).

Svar

Vi kan testa för att se om det första fältet börjar med ett nummer och bara skriva ut det andra

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

Detta matchar din källfil och returnerar

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

Kommentarer

  • Varför inte [0-9]+ coz first column is always a number? Ingången kommer också tydligt från ett kommando, så det ska pipas
  • Inte alla versioner av awk stöder + syntax. Frågan sa att data kom från electric_thermal.dat
  • Hmm ,,, jag förbises kommentaren i manuset. Tack. När det gäller + Jag hade aldrig problem med att använda dem med gnu/non-gnu awks Vilken version menade du?
  • Gamla gamla system 🙂

Svar

awk är din vän:

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

ska göra 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

Om ovanstående 7 rader är bestående efter att kommandot har utförts använd varje gång:

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

sed 1,7d döljer helt enkelt de första 7 raderna, som du inte behöver . awk sorterar exakt det innehåll du faktiskt letar 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

Svar

Prova detta:

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

Kommentarer

  • Lär dig att använda kodblock.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *