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
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]+
cozfirst 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ånelectric_thermal.dat
- Hmm ,,, jag förbises kommentaren i manuset. Tack. När det gäller
+
Jag hade aldrig problem med att använda dem medgnu/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
- Downvote: Nyttelös [ användning av katt ] , och lösningen uppfyller inte ' y kraven. Formatera också koden.
Svar
Prova detta:
awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile
Kommentarer
- Lär dig att använda kodblock.
tail
och sedanawk
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.