2017-06-22 2 views
-2
400 1  2017-06-21T13 rrrrr rrere rrrrr /var/spool/mail/1 1  fsfgagd dfgdfgfg 
       :01:09.000-07      495555555_0f102_ke           
       :00.        rnel_topg.0.tar.gz 

402 1  2017-06-21T13 rrrrr rrere rrrrr /var/spool/mail/1 1  fsfgagd dfgdfgfg 
       :01:09.000-07      495555555_0f102_ke           
       :00.        rnel_topg.0.tar.gz 

403 1  2017-06-21T13 rrrrr rrere rrrrr /var/spool/mail/1 1  fsfgagd dfgdfgfg 
       :01:09.000-07      495555555_0f102_ke           
       :00.        rnel_topg.0.tar.gz 

404 1  2017-06-21T13 rrrrr rrere rrrrr /var/spool/mail/1 1  fsfgagd dfgdfgfg 
       :01:09.000-07      495555555_0f102_ke           
       :00.        rnel_topg.0.tar.gz 

Ich habe einen Eingang wie unten gezeigt. Ich habe 100 solcher Zeilen wie oben gezeigt. Und jede Zeile benötigt 3 Zeilen und sie sind in einem tabellenartigen Muster formatiert. Ich kann Bash oder Python oder beides verwenden.Text-Extraktion

Dies ist, was ich

tr -s " " | awk '{print $1 $2 $3}' 

mit Regex bisher

versucht haben: ^\d*(.*)\/var\/spool\/mail\/\d*(.*)

Was ich brauche, ist ein Wörterbuch {'400':'/var/spool/mail/1495555555_0f102_kernel_topg.0.tar.gz'}

+0

Bitte setzen Sie mehr aus der Eingabedatei und erwartet darunter. – sjsam

Antwort

0

Sie awk verwenden können diese

# cat file 
400 1  2017-06-21T13  /var/spool/mail/1 1 
       :01:09.000-07  495555555_0f102_ke 
       :00.    rnel_topg.0.tar.gz 
500 1  2017-06-21T13  /var/spool/mail/2 1 
       :01:09.000-07  495555675_0f102_ke 
       :00.    rnel_topf.1.tar.gz 
# awk 'BEGIN{i=1}{if(i==1){f1=$1;f2=$4;i++}else if(i==2){f2=f2 $2;i++}else{f2=f2 $2;printf "{'%s','%s'}",f1,f2;print "";i=1}}' file 
{400,/var/spool/mail/1495555555_0f102_kernel_topg.0.tar.gz} 
{500,/var/spool/mail/2495555675_0f102_kernel_topf.1.tar.gz} 
zu lösen
+0

Wie würden Sie es tun, wenn es einen Unterschied von 4 Spalten zwischen den 2 gibt!Wie in diesem Fall ist es nur 2.! Was wäre, wenn ich "n" Anzahl von Spalten hatte, bevor die erforderlichen Felder erreicht wurden. –

0

Wenn die Tabelle/l ine Struktur ist so streng, wie Sie sagen, dann könnte man einen regulären Ausdruck wie folgt verwenden:

^(\d+)[^\/]+([^\s]+).+\n[^\-]+-\d+\s+([^\s]+).+\n[^a-z]+([\w.]+)

dies Ihre erforderlichen Daten in 4 Gruppen erfasst (die Bits innerhalb der Klammern) dann ‚Maschen‘ es zusammen mit:

{'$1':'$2$3$4'}

Sie den gewünschten Ausgang zu geben, zB

{'400':'/var/spool/mail/1495555555_0f102_kernel_topg.0.tar.gz'}

Regex101 demo here

Breaking down, was die Regex tut:

^(\d+) capture die ersten Ziffern am Anfang der Zeile

[^\/]+ alles überspringen bis zum nächsten / Charakter

([^\s]+) capture alles bis zum nächsten Leerzeichen

.+\n Spiel (aber nicht erfassen) alles bis zum Newline

[^\-]+-\d+\s+ dieser Abschnitt ist ein wenig verworren, aber ich war für einen ‚Haken‘ suchen. Es springt alles bis zum -, dann + Spielen Ziffer Räume

([^\s]+) Capture alles auf den nächsten Platz

.+\n[^a-z]+ Spiel (aber nicht erfassen) alles bis zum Newline, dann alles, was nicht ist alpha-Zeichen im Bereich a-z

([\w.]+) Capture alle Wortzeichen (az oder _) und Perioden

Auch dies wird wahrscheinlich nur funktionieren, wenn die Linien so streng wie Ihre Beispiele strukturiert sind