2016-07-27 24 views
-4

ich eine Datei mit dieser Struktur haben:Wie Felder aus verschiedenen Linien analysieren einen neuen Rekord whith diese bauen alle fileds

http://paste.ubuntu.com/21136265/

Und ich habe alle Daten aus der Leitung erfassen ‚ADSTART ACTION (HINZUFÜGEN) zur nächsten Zeile mit demselben Text, um einen einzelnen Datensatz oder eine einzelne Zeile zu erstellen.

Tut mir leid, aber ich kann kein Beispiel für die Ausgabe, da alle Daten zwischen den 'ADSTART' Zeilen in einer einzigen Zeile oder Datensatz, Im arbeiten unter z/OS und wir haben das Konzept der Datensatzlänge.

Ich versuche dies in REXX für z/OS und in AWK in UNIX SYSTEM SERVICES für z/OS, aber ich bin stucked setzen alle Felder in eine Zeile, und ich kann nicht herausfinden, wie es geht.

Im Erfassen der Daten durch verschachtelte Schleifen, aber ich weiß nicht, um es in einer einzigen Zeile zu setzen.

Jede Idee würde geschätzt werden.

Danke in Advandce.

Patricio.

+3

Ihre Frage ist nicht klar .. und anstelle dieser großen schwer zu verstehen Datei, geben Sie eine kleinere, einfachere Beispiel Eingabedatei und erwartete Ausgabe .. Fügen Sie auch die Befehle, die Sie in Frage zu stellen .. http: // stackoverflow. com/help/mcve für weitere Informationen – Sundeep

+0

Sorry, ich habe versucht, die Frage zu klären. –

+1

Sie könnten ein Handbuch Beispiel mit 5-10 Zeilen erstellen und Beispielausgabe für das .. wieder geben, müssen Sie Ihren Lösungsversuch auch zeigen .. – Sundeep

Antwort

0

Versuchen Sie dies;

sed -n '/ADSTART ACTION(ADD)/,/ADRUN/p' <filename> | sed 's/ADRUN ACTION(ADD)//g' 
+0

Vielen Dank –

0

Vielleicht würde es tun:

awk '/ADSTART ACTION\(ADD\)/{print buf; buf=""} {buf=buf""$0" "} END{print buf}' test.in 

kommentiert Version:

/ADSTART ACTION\(ADD\)/ { # for records where ADSTART occurs 
    print buf    # output the buffer variable 
    buf=""     # then empty the buffer 
} 
{       # for all records 
    # gsub(/^ +| +$/,"")  # here you could trim leading and trailing space 
    buf=buf""$0" "   # build the buffer 
} 
END {      # in the end 
    print buf    # output the remaining buffer 
} 
+0

Vielen Dank. –

1

Wenn Sie REXX verwenden dann, warum Sie nicht nur den Parsing-Befehl verwenden, die kratzen Datei melden? Der Parse-Befehl verwendet ein Vorlagenmuster, das sehr einfach aber leistungsstark ist.

Hier ist ein Beispiel:

/* REXX */ 

queue "ADSTART ACTION(ADD)" 
queue " ADID(ABCD0B   ) ADVALFROM(111230) CALENDAR(CALSEM7J  )" 
queue " DESCR('DESCRIPTION ')" 
queue " ADTYPE(A)" 
queue " GROUP(PBQOPC )" 
queue " OWNER('OWNER1')" 
queue " PRIORITY(5) ADSTAT(A)" 
queue " ODESCR('ALADIN     ')" 
queue "ADRUN ACTION(ADD)" 
queue " PERIOD(HEB ) RULE(3) VALFROM(091230) VALTO(711231)" 
queue " SHIFT( 0)    SHSIGN(F)" 
queue " DESCR('DESCRIPTION')" 
queue " TYPE(N)" 
queue " IADAYS( 1, 2, 3, 4, 5, 6, 7)" 
queue " IATIME(1700) DLDAY( 1) DLTIME(0600)" 

do while queued() > 0 
    parse pull rec 
    select 
    when startswith(rec,"ADSTART") then do 
     p. = '' /* the output record */ 
     parse var rec with . 'ACTION('p.action')' 
     do queued() 
     parse pull rec 
     if left(rec,1) /= ' ' then do 
      /* End of parameter group. Re-queue the record and break */ 
      push rec 
      leave 
     end 
     select 
      when startswith(rec, " ADID") then do 
      parse var rec with . "ADID("p.adid") ADVALFROM("p.advalfrom")" , 
       "CALENDAR("p.calendar")" 
      end 
      when startswith(rec, " DESCR") then do 
      parse var rec with "DESCR('"p.desc"')" 
      end 
      when startswith(rec, " PRI") then do 
      parse var rec with "PRIORITY("p.priority") ASTAT("p.adstat")" 
      end 
      otherwise nop 
     end 
     end 
     /* write out the record in 1 line */ 
     say strip(p.action) strip(p.adid) strip(p.advalfrom) strip(p.calendar), 
      strip(p.desc) strip(p.priority) strip(p.adstat) 
    end 
    when startswith(rec,"ADRUN") then do 
     /* do some stuff to parse this */ 
    end 
    otherwise nop 
    end 
end 

exit 0 

startswith: 
    parse arg input, prefix 
    input_len = length(input) 
    if input_len = 0 then return 0 
    prefix_len = length(prefix) 
    if prefix_len = 0 then return 0 
    return input_len >= prefix_len & left(input,prefix_len) = prefix 

Sehen, wie Sie in z/OS-UNIX-Umgebung vertraut sind, wenn Sie etwas ein wenig mächtiger wollen als REXX und/oder AWK Sie meine z/OS port of Lua Kasse sollte. Es kommt mit einer LPeg package, die es einfach macht, Lexer und Parser mit sehr wenigen Codezeilen zu schreiben.

Wenn Sie nur Textfluss die TWS-Steueranweisungen in eine Zeile ohne Erfassung der Felder möchten, dann ist das sehr einfach zu tun.

/* REXX */                 

queue "ADSTART ACTION(ADD)"             
queue " ADID(ABCD0B   ) ADVALFROM(111230) CALENDAR(CALSEM7J  )" 
queue " DESCR('DESCRIPTION ')"            
queue " ADTYPE(A)"               
queue " GROUP(PBQOPC )"              
queue " OWNER('OWNER1')"              
queue " PRIORITY(5) ADSTAT(A)"            
queue " ODESCR('ALADIN     ')"         
queue "ADRUN ACTION(ADD)"              
queue " PERIOD(HEB ) RULE(3) VALFROM(091230) VALTO(711231)"   
queue " SHIFT( 0)    SHSIGN(F)"         
queue " DESCR('DESCRIPTION')"            
queue " TYPE(N)"                
queue " IADAYS( 1, 2, 3, 4, 5, 6, 7)"        
queue " IATIME(1700) DLDAY( 1) DLTIME(0600)"        

do while queued() > 0               
    parse pull rec                
    if left(rec,1) /= ' ' then do            
    line = rec                
    do queued()                
     parse pull rec               
     if left(rec,1) /= ' ' then do           
     push rec;leave                 
     end                  
     line = line rec               
    end                  
    say space(line,1) 
    end                   
end                   

exit 0  
+0

Danke David, http://lua4z.com/ scheint ziemlich interessant! Ich werde dieses Tool ausprobieren. –

0

Obwohl oben die Lösung nicht viele Zeilen pro Block arbeiten konnte, wurde eine Lösung, die den Text zwischen ADSTART ACTION (ADD) wird nur gedruckt und übernimmt nur einen Block wird

Bash gedruckt werden:

gawk 'ANFANG {s = 0} /ADSTART.*ACTION (ADD)/{s = (s + 1)% 2} (s == 1) {print}' | sed ': ein; N; $ ba; s/\ n // g'

(ADSTART ... Linien weggelassen)

+0

Danke Jaime !. –

0

Vielen Dank für alle Antworten.

Endlich war es ziemlich einfach, denn wenn ich einen FTP von z/OS zu USS (Unix System Services für z/OS) binär bin, sind alle Daten in einer Zeile.

Zuerst habe ich mit einer Datei gearbeitet, die mit FTP (ASCII xlate) auf meinen PC übertragen wurde, und dann in binärer FTP mit WinSCP an USS übertragen.

Dies ist der Code I verwendet, um ein Textmuster mit Wagenrücklauf zu ersetzen:

sed 's/ADSTART ACTION(ADD)/\ 
    /g' <input file> ><output file> 

mit Wagenrücklauf eingeführt durch Drücken Enter-Taste, da/r/'$' ''/n/x0D ‚didn Ich habe in USS gearbeitet, ich weiß nicht warum.

Vielen Dank noch einmal für Ihre Zeit.

Patricio.