![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| Shell Programmering og Scripting Post spørgsmål om ksh, CSH, SH, Bash, Perl, PHP, SED, AWK og ANDRE shell scripts og Shell scriptsprog her. |
![]() |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
||||
|
Hjælp med awk funcions
Jeg har et problem med min script. Det virker for det meste, men er ikke meget bærbare. Eksemplet er stikprøve af "input file" og klippe og indsætte af "script. Scriptet arbejder bøde hvis følgende system portioner er outputted som følger: SYSTEM CFO er efterfulgt af SYSTEM DAX SYSTEM DAX er efterfulgt af SYSTEM TC SYSTEM TC er efterfulgt af STETEM andet På forskellige enheder nogle af System portioner er ikke outputted i samme orden eller nogle af de System portioner er ikke outputted overhovedet. Mit spørgsmål er, hvordan kan jeg ændre awk funktioner at stoppe behandlingen på ét system og begynde behandling på næste system portion, når den næste system portion er ikke nævnt i den del selv, f.eks funktionskontinuitet (DAX): Code:
while (( getline > 0 ) && ( $3 != "TC" )) {
I ovenstående linje kode, $ 3 TC er næste system portion, som fortæller funktion til at stoppe behandlingen. Her er udsnit af input filen: Code:
doal cont pegc system1 call7 solh RX SYSTEM CFO DATE 322:47:34 DPORQ = 0 TTORQ = 0 DPINRQ= 0 MFINRQ= 0 CDIRR = 0 TCBSY = 0 TCINT = 0 TCANS = 0 TCRNG = 0 RPINRQ= 0 C6INRQ= 0 ISUPRQ= 11147 TUPRQ = 0 MFOURQ= 0 C6OURQ= 0 ISUPOR= 17417 BICCRQ= 0 BICCOR= 0 POVFL = 0 doal cont pegc system1 call7 solh RX SYSTEM DAX DATE 322:47:34 proc cpu systm load sactv orig ovldpu mmst 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 doal cont pegc system1 call7 solh RX SYSTEM TC DATE 322:47:34 proc pucco load chgro chmert chinc chout ceqpu 22 2 97 0 0 2707 6374 0 1 3 15011 0 0 2717 6651 0 2 3 12976 0 0 2139 6137 0 3 3 13898 0 0 2199 6583 0 4 3 15123 0 0 2478 7788 0 5 3 13823 0 0 2645 5789 0 Her er udsnit af script: Code:
/usr/xpg4/bin/awk '
$3 == "CFO" { cFO() }
$3 == "DAX" { dAX() }
$3 == "TC" { tC() }
function dAX( _xm)
{
while (( getline > 0 ) && ( $3 != "TC" )) {
do a a lot of awk stuff here....
.
.
.
.
.
}
}
function tC( _msx)
{
while (( getline > 0 ) && ( $3 != "OND" )) {
do a a lot of awk stuff here....
.
.
.
.
.
}
}
function cFO( _iu)
{
while (( getline > 0 ) && ( $3 != "DAX" )) {
do a a lot of awk stuff here....
.
.
.
.
.
}
} FILENAME
Thanks in advance. |
|
||||
|
Hvorfor gør du ikke bare ændre den tilstand, hvor den stopper, dvs når du trykker på "doal linie"? Code:
while (getline && $1 != "doal") {
Hvis du er nødt til at gøre enhver behandling af "doal linie" indhold kan du bare gøre det efter mens sløjfe. |
|
||||
|
Annihilannic, Første Tak for at se på dette for mig. Men desværre er de data jeg indsendt kun var et uddrag af hvad jeg har. Undertiden er det tal er som følger: Code:
doal cont pegc system1 call7 solh RX SYSTEM CFO DATE 322:47:34 DPORQ = 0 TTORQ = 0 DPINRQ= 0 MFINRQ= 0 CDIRR = 0 TCBSY = 0 TCINT = 0 TCANS = 0 TCRNG = 0 RPINRQ= 0 C6INRQ= 0 ISUPRQ= 11147 TUPRQ = 0 MFOURQ= 0 C6OURQ= 0 ISUPOR= 17417 BICCRQ= 0 BICCOR= 0 POVFL = 0 doal cont pegc system1 call7 solh RX SYSTEM CFO DATE 322:47:34 DPORQ = 0 TTORQ = 0 DPINRQ= 0 MFINRQ= 0 CDIRR = 0 TCBSY = 0 TCINT = 0 TCANS = 0 TCRNG = 0 RPINRQ= 0 C6INRQ= 0 ISUPRQ= 11158 TUPRQ = 0 MFOURQ= 0 C6OURQ= 0 ISUPOR= 17459 BICCRQ= 0 BICCOR= 0 POVFL = 0 doal cont pegc system1 call7 solh RX SYSTEM DAX DATE 322:47:34 proc cpu systm load sactv orig ovldpu mmst 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 Og jeg er nødt til at behandle begge dele som én. Men du gjorde give mig en idé om, hvordan andre om at løse, hvis muligt. Er der en måde at teste linjen nedenfor uden at gøre enhver behandling på denne linje??? Jeg vil prøve at forklare, om dette uafprøvede kode: Code:
while (( getline > 0 ) && ( $1 != "doal" ) && ( getline ; $3=! "CFO")) Det, jeg forsøger at sige, er, er det muligt at afprøve $ 3 under "doal linie"? |
|
||||
|
Det er svært at rådgive dig uden at vide, hvad koden gør indeni dem, mens loops, men i din holdning, jeg vil forsøge at undgå at bruge dem fuldstændigt, og gøre noget mere på denne måde: Code:
awk '
/^RX SYSTEM/ { section=$3 }
section=="CFO" {
print "processing CFO stuff: " $0
}
section=="DAX" {
print "processing DAX stuff: " $0
}
section=="TC" {
print "processing TC stuff: " $0
}
' inputfile > outputfile
Det er muligt at "se fremad" på de efterfølgende linjer ved at gemme hver linje, som du læse det i en variabel, og behandlingen af data, der lagres i variablen, når du læser den efterfølgende linje med det lille komplikation, at du har brug for at håndtere den sidste linje af data i slutningen () klausul af dit script. |
![]() |
| Bogmærker |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|