2016-05-04 3 views
-1

Ich habe eine Datei mit unterschiedlichen Salden für ein bestimmtes Konto. Und jeden Tag ändert sich dieses Gleichgewicht. Was ich tun möchte, ist Kontostand eines bestimmten Kontos basierend auf dem letzten Datum zu extrahieren.Um Datensätze aus der Datei basierend auf dem letzten Datum zu extrahieren und in einer neuen Datei zu speichern

Ich verfolge einen Ansatz, bei dem ich das Datum in der ersten Spalte von Datensätzen unter Verwendung eines awk Skript manuell am Hinzufügen aber aus dem Dateinamen unter Zeitpunkt, da ich in meinen Unterlagen nicht Datum. Als nächstes möchte ich die Datensätze basierend auf der Kontonummer sortieren und den Datensatz mit dem letzten Datum in einer anderen Datei extrahieren.

Kann mir jemand dabei helfen?

Bis jetzt habe ich diesen Code geschrieben und ich bin nicht in der Lage, die Daten in die andere Datei zu sortieren und zu extrahieren

#!/usr/bin/ksh 

f=mainfile_20151201.dat 
s=`echo $f | cut -c 16-23` 
echo "$f -> $s" 

awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ; date='$s' ; IFS = "~"} { $1=date"~"$1 ; print }' mainfile_20151201.dat > tempdate 

awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ; IFS = "~"} { $1 ; print }' tempdate > newfile 

Beispieldaten:

AccountNumber~~0~149038.40000000~149038.4~0.00000000~0.00000000~0.00000000 

Bitte beachten Sie, dass die Daten in der vierten Feld ändert jeden Tag

+0

Ihre Eingabedatei enthält nur eine Zeile? Wenn nicht, dann stellen Ihre geposteten Beispieldaten nicht Ihre echten Daten dar und sind daher nicht nützlich. Bearbeiten Sie Ihre Frage so, dass sie eine prägnante, testbare und wirklich repräsentative Beispieleingabe sowie die Ausgabe enthält, die Sie bei dieser Eingabe erwarten. –

Antwort

0

Wenn Ihre Hauptdatei immer im Format "Something_date" sein wird, sollte dies den Job in Ordnung tun.

#!/bin/bash 
f=mainfile_20151201.dat 
s=`echo $f | cut -d"_" -f2` 
echo "$f -> $s" 
awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ; date='$s' ; IFS = "~"} { $1=date"~"$1 ; print }' mainfile_20151201.dat > tempdate 
awk -F "~" 'BEGIN { OFS = "~"; ORS = "\n" ; IFS = "~"} { $1 ; print }' tempdate > newfile 
rm tempdate 

sort -u -t~ -k 2 <newfile >newfile.s 
#sort by unique arange by field 2 then field 1 (default action) 

d=$(cat newfile.s | head -1 | cut -d"~" -f1) #get first date 
a=$(cat newfile.s | head -1 | cut -d"~" -f2) #get first account number 

while read line; do 
d2=`echo "$line" | cut -d"~" -f1` #get date from line 
a2=`echo "$line" | cut -d"~" -f2` #get account from line 
if [[ $a2 == $a ]] && [[ $d2 > $d ]] || [[ $d2 == $d ]];then #if acount are same but date is 'bigger' OR the same 
sed -i '$ d' output.txt #remove last line of file 
echo "$line" >> output.txt #append to file 
a="$a2" #set new account for later 
d="$d2" #set new date for later 
else 
a="$a2" 
d="$d2" 
echo "$line" >>output.txt 
fi 
done <newfile.s #while input declaration 

Hinweis: Dies funktionierte aus Ihrem Kommentar mit der Probe muß aber auf jeden Fall für Ihre Bedürfnisse tweeked werden. Auf jeden Fall sollte es reichen, um Sie in Schwung zu bringen. Hoffe das hilft!

+0

Dies ist hilfreich beim Sortieren der Datei. Aber meine Frage ist, wie man den letzten Datumseintrag aus der Ausgabedatei in eine andere Datei extrahiert. Zum Beispiel, wenn man bedenkt, Ihre Ausgabe: 20151201 ~ 1232455767 ~~ 0 ~ 149038,40000000 ~ ~ 149.038,4 0,00000000 ~ 0,00000000 ~ 0,00000000 20151202 ~ 1232455767 ~~ 0 ~ 178638,40000000 ~ ~ 149.038,4 0,00000000 ~ 0,00000000 ~ 0,00000000 20151201 ~ 2341245456 ~~ 0 ~ 149038.40000000 ~ 149038.4 ~ 0.00000000 ~ 0.00000000 ~ 0.00000000 Die ersten 2 Datensätze haben die gleiche Kontonummer und ich möchte 20151202 Datensatz in meiner Ausgabedatei, wo Balance (5. Feld) in größer. Ist es möglich? – Pranav

+0

Es ist, aber die einzige Lösung, die ich Ihnen geben könnte, wäre eine ziemlich lange While-Schleife. Ich bin mir sicher, dass jemand mit mehr Erfahrung als ich einen schicken One-Liner vorschlagen könnte, der 'awk' oder' perl' verwendet, um die Ausgabe zu filtern. –

Verwandte Themen