Extrahieren, sortieren und speichern Sie Daten aus mehreren Dateien in einer

479
zaonline

Ich habe mehrere .sieDateien

Das SIE-Format ist ein offener Standard für die Übertragung von Abrechnungsdaten zwischen unterschiedlicher Software, die von verschiedenen Softwareanbietern produziert wird. Ich möchte einige Informationen extrahieren und eine große geordnete Datei erstellen, die nach Datum sortiert ist. Ich versuche, eine Registerkarte zwischen den Spalten einzufügen.

Hier ist ein Beispiel für den Inhalt der Dateien:

#FLAGGA 0 #PROGRAM "ISUPOS Kassa 3" 3.1.129 #FORMAT PC8 #GEN 20180119 #SIETYP 4 #FNAMN "Café" #VER "" "1" 20180113 "Z-Dagrapport #1, Kassa #1 2018-01-13" { #TRANS 1910 {} 819.00 #TRANS 1920 {} 1334.00 #TRANS 1930 {} 438.00 #TRANS 2620 {} -277.61 #TRANS 3052 {} -2313.39 } 

Dies ist aus einer Datei. Einige Dateien enthalten möglicherweise nicht alle #TRANSZeilen.

Ich möchte, dass die "große Datei" eine Zeile für jede Datei enthält, z

2018-01-13 819 1334.00 438.00 -277.61 -2313.39 

Wenn einer der #TRANSDatensätze fehlt, sollte 0an seiner Stelle stattdessen eine (Null) stehen.

Ich habe es ausprobiert sedund awkkann nicht erreichen, was ich will. Der nächste Schritt ist das Importieren der großen Datei, um sie zu übertreffen.

0
Bitte beachten Sie, dass https://superuser.com kein kostenloser Skript- / Code-Schreibservice ist. Wenn Sie uns sagen, was Sie bisher versucht haben (einschließlich der Skripts / des Codes, die Sie bereits verwenden) und wo Sie stecken bleiben, können wir versuchen, bei bestimmten Problemen zu helfen. Sie sollten auch lesen [Wie kann ich eine gute Frage stellen?] (Https://superuser.com/help/how-to-ask). DavidPostill vor 5 Jahren 0
Was bedeutet "wenn * einer * der Transdatensätze fehlt"? Sind es nur diese 5 "Schlüssel" (1910,1920,1930,2620,3052)? glenn jackman vor 5 Jahren 0
@DavidPostill Ich stehe bei allem fest. Ich habe es geschafft, die Felder, die mich interessieren, aus einer Datei zu extrahieren. Ich schaffe es jedoch nicht, die Daten aus einer Datei in einer Zeile und die nächste Datei in der zweiten Zeile nach Datum sortiert zu sortieren. zaonline vor 5 Jahren 0
@glennjackman Einige Dateien haben weniger Datensätze. zB 1920, 1930, 2620, 3052, aber nicht 1910. In diesen Fällen sollte es eine Null anstelle des fehlenden Datensatzes sein. zaonline vor 5 Jahren 0
@DavidPostill Gibt es eine geeignetere Site für diese Art von Fragen, die Sie kennen? zaonline vor 5 Jahren 0

1 Antwort auf die Frage

1
Sasha Golikov

Dieses einfache awk-Programm sucht in der Eingabedatei bestimmte #TRANS-Nummern und fügt sie in die Tabelle ein. Wenn ein oder mehrere #TRANS nicht vorhanden sind, ist in Null.

awk ' BEGIN{ for(i=1;i<=6;i++){ o[i]=0 } } /#VER/ { date=$4; o[1]=substr(date,0,4)"-"substr(date,5,2)"-"substr(date,7,2); } /#TRANS 1910/{ o[2]=$4 } /#TRANS 1920/{ o[3]=$4 } /#TRANS 1930/{ o[4]=$4 }  /#TRANS 2620/{ o[5]=$4 } /#TRANS 3052/{ o[6]=$4 } END{ for(i=1;i<=6;i++){ out=out o[i] " "; } print out } ' file 

Für viele Dateien können Sie solchen Code verwenden:

echo "DATE TRANS1910 TRANS1920 TRANS1930 TRANS2620 TRANS3052" >result.txt for file in $(ls -1 *.sie); do  awk ' BEGIN{ for(i=1;i<=6;i++){ o[i]=0 } } /#VER/ { date=$4; o[1]=substr(date,0,4)"-"substr(date,5,2)"-"substr(date,7,2); } /#TRANS 1910/{ o[2]=$4 } /#TRANS 1920/{ o[3]=$4 } /#TRANS 1930/{ o[4]=$4 }  /#TRANS 2620/{ o[5]=$4 } /#TRANS 3052/{ o[6]=$4 } END{ for(i=1;i<=6;i++){ out=out o[i] " "; } print out } ' $ >> result.txt done 

Das Ergebnis wird sein:

cat result.txt  DATE TRANS1910 TRANS1920 TRANS1930 TRANS2620 TRANS3052 2018-01-13 819.00 1334.00 438.00 -277.61 -2313.39 
Funktioniert ausgezeichnet. Danke für deine Hilfe! zaonline vor 5 Jahren 0