2017-05-01 4 views
0

i zwei Dateien haben, ist var.txt und andere res.dat DateiWie zwei Dateien vergleichen und extrahieren Informationen

var.txt informaton enthält wie unten

date,request,sales,item 
20171015,1,123456,216  
20171015,1,123456,217 
20171015,2,345678,214  
20171015,3,456789,218 

und res.dat enthält eine separate dat-Datei zu erstellen haben, zum Beispiel in var.txt ist eine riesige Datei enthält unter

RTCCVB01 213456 123456 216 
. 
. 
. 
VBPCVB01 

RTCCVB01 213456 345678 214 
. 
. 
. 
VBPCVB01 

RTCCVB01 213456 123456 217 
. 
. 
. 
VBPCVB01 

RTCCVB01 213456 456789 218 
. 
. 
. 
VBPCVB01 

Informationen wie i für eine eindeutige Anfrage für die zweite Spalte Anfrage für Antrag 1 ist Verkäufe 123456, die 216 2 Artikel hat und 217, so dass die dat-Datei wird wie unter

für Antrag 1 erstellt werden - 123456.dat

RTCCVB01 213456 123456 216 
. 
. 
VBPCVB01 

RTCCVB01 213456 123456 217 
. 
. 
. 
VBPCVB01 

für Request 2 345678.dat

RTCCVB01 213456 345678 214 
. 
. 
. 
VBPCVB01 

für Request 3 456789.dat

RTCCVB01 213456 456789 218 
. 
. 
. 
VBPCVB01 
in res.dat Datei auf 72-79 Position

Umsatz tritt bei 50-56 Position in res.dat Datei
Artikel

ich habe zu schreiben, einen Shell-Skript auftreten, das für jede Anforderung von var tut unten wird. txt es dauert Verkäufe und Artikel und extrahieren Informationen aus res.dat und erstellt separate Dat-Dateien, bis alle Anfrage Nummer erfolgt ist.

wenn ich schneide -d, -f3,4 var.txt
Ausgang 123456 216

ich habe sein wird, Verwenden Sie die obige Ausgabe und suchen Sie rekursiv in der res.dat-Datei. Entspre- chend werden auf Grundlage der Anforderung Datendateien erstellt

+0

Gut Christus Mann. Sortieren Sie Ihre Beispiele aus. – Henry

+0

ist sehr einfach. Ich werde Antwort geben, nachdem ich meinen Tasse Tee beendet habe – Rico

+0

warte, warte, warte ich auf Linux? – Rico

Antwort

1

Gefällt mir? Die var.dat scheint nutzlos, basierend auf der erwarteten Ausgabe.

$ awk 'BEGIN{RS=ORS="VBPCVB01\n"}{f=$3 ".dat"; print >> f; close(f)}' res.dat 
$ cat 123456.dat 
RTCCVB01 213456 123456 216 
. 
. 
. 
VBPCVB01 

RTCCVB01 213456 123456 217 
. 
. 
. 
VBPCVB01 

Erklärt:

awk ' 
BEGIN { RS=ORS="VBPCVB01\n" } # set the delimiters appropriately 
{ 
    f=$3 ".dat"    # set $3 as the filename 
    print >> f     # append records to the file 
    close(f)     # close the file (due to "huge file") 
}        # to avoid running out of fds (unknown unix) 
' res.dat      # this file only 
+0

Wenn Sie sehen, dass die var.txt die zweite Spalte Anfrage enthalten, enthält die dritte Spalte Verkäufe und die vierte Spalte ist das Element, ich muss Eingaben von var.txt nehmen, die die Verkäufe sein werden, die eindeutig ist und der entsprechende Artikel, zum Beispiel für Anfrage 1, gibt es einen eindeutigen Verkauf -123456 und es hat 2 Artikel keine 216 und 217, so dass es eine einzelne Datendatei usw. für jede Anfrage erstellen wird, wird es eine einzelne Datendatei erstellen – user229374

1

Short awk Ansatz:

awk '/RTCCVB01/{fn=$3}{print > fn".dat"}' res.dat 

Dieser Befehl enthält zwei Sätze von geschweiften Klammern: Die Steuerung geht auf den ersten Satz von geschweiften Klammern nur bei der Begegnung mit einer Linie c Erhalt des Musters RTCCVB01. Die zweite Menge wird von jeder Zeile angetroffen, da es keine Bedingung gibt und daher immer wahr ist.

Beim Auftreten des Musters RTCCVB01 wird ein neuer Dateiname erstellt und gespeichert. Wenn die erste RTCCVB01 kommt, fn enthält 123456 und die Steuerung geht an die nächste Reihe von geschweiften Klammern und der Datensatz wird in 123456.dat geschrieben, und die nachfolgenden Datensätze gehen die Datei 123456.dat bis die nächste RTCCVB01 kommt.


cat 123456.dat 
RTCCVB01 213456 123456 216 
. 
. 
. 
VBPCVB01 

RTCCVB01 213456 123456 217 
. 
. 
. 
VBPCVB01 

cat 345678.dat 
RTCCVB01 213456 345678 214 
. 
. 
. 
VBPCVB01 

cat 456789.dat 
RTCCVB01 213456 456789 218 
. 
. 
. 
VBPCVB01 
+0

Schöne kompakte Lösung. Die resultierenden Dateien (mit Ausnahme der letzten) haben eine abschließende leere Zeile. Aufgrund der nachlässigen Formatierung der ursprünglichen Frage sollte das in Ordnung sein. – ULick

+0

@ULick, ja, eine abschließende Leerzeile kann sinnvoll sein, wenn Sie '>>' neue Datensätze an eine Datei weiterleiten – RomanPerekhrest

+0

@RomanPerekrest, wenn die var.txt in der zweiten Spalte die Anfrage enthält, die dritte Spalte die Verkäufe und die vierte Spalte Spalte ist der Artikel, ich muss Eingaben von var.txt nehmen, die die Verkäufe sein werden, die einzigartig sind und sein entsprechender Artikel, zum Beispiel für Anfrage 1, gibt es einzigartige Verkäufe -123456 und es hat 2 Einzelteile nein 216 und 217, so es wird eine einzige Datendatei erstellen – user229374

Verwandte Themen