2017-04-22 4 views
0

Ein Job auf dem Server läuft und es erstellt eine Datei wie unten:Zählen Sie die Anzahl der Datensätze nach Ersetzen doppelte Werte

1000727888004 
522101 John Smith 
522101 John Smith 
522188 Shelly King 
522188 Shelly King 
1000727888002 
522990 John Doe 
522990 John Doe 
9000006000000 

Derzeit sind wir dabei, den Code zu beheben, aber das wird einen Monat dauern . In der Zwischenzeit verwende ich einen Befehl, um die doppelten Datensätze wie unten zu entfernen.

perl -ne 'print unless $dup{$_}++;' old_file.txt > new_file.txt 

Nachdem ich den obigen Befehl auszuführen, ist es die doppelten Einträge entfernt, sondern zählt bleiben gleich wie unten:

1000727888004 
522101 John Smith 
522188 Shelly King 
1000727888002 
522990 John Doe 
9000006000000 

letzte Nummer für Zeile beginnend mit 1 ist die Gesamtzahl (so sollte 4 gewesen 2 in der ersten Zeile und 2 sollte in der vierten Zeile 1 gewesen sein und 6 hätte in der letzten Zeile 3 sein sollen, beginnend mit 9). Es sollte wie folgt aussehen:

1000727888002 
522101 John Smith 
522188 Shelly King 
1000727888001 
522990 John Doe 
9000003000000 

Ich konnte keine Logik finden, die es beheben würde. Ich brauche Hilfe hier. Kann ich einen anderen Befehl ausführen oder etwas in meinem Perl-Befehl hinzufügen, um die Zählung ebenfalls zu korrigieren. Ja, ich kann die Datei in Notepad ++ öffnen und die Zahlen manuell korrigieren, aber ich versuche, sie automatisiert zu bekommen.

Danke!

+0

Was das letzte Datensatz ist, beginnend mit 9? –

+0

Das ist der Trailer der Datei mit der Gesamtzahl. Die erste 9 ist immer vorhanden und dann sind die nächsten 6 Zahlen die Zählung. Wenn es in einer Ziffer ist, dann werden 5 Nullen auf der linken Seite aufgefüllt. und die letzten 6 Zahlen sind immer 0 – Amir

Antwort

0

In awk. Es verarbeitet die Dupes innerhalb der "Blöcke" zwischen den Zählwertaufzeichnungen, d. Es berücksichtigt keine Duplikate innerhalb der gesamten Datei. Wenn das eine falsche Annahme ist, lassen Sie es mich wissen.

$ awk ' 
NF==1 {   # for the cout record 
    if(c!="") # this fixes leading empty row 
     print c # print count 
    for(i in a) # all deduped data records 
     print i # print them 
    delete a  # empty hash 
    c=$0   # store count (well, you could use just the first count record) 
    next   # for this record don't process further 
} 
{ 
    if($0 in a) # if current record is already in a 
     c--  # decrease count 
    else a[$0] # else hash it 
} 
END {   # last record handling 
    print c  # print the last record 
    for(i in a) # just in case last record would be missing 
     print i # this and above could be removes 
}' file 

Ausgang:

1000727888002 
522101 John Smith 
522188 Shelly King 
1000727888001 
522990 John Doe 
9000006000000 

Wenn die Betrogenen in der gesamten Datei entfernt werden, und der letzte Datensatz war auch der Graf:

awk ' 
NF==1 { 
    if(NR==1) 
     c=$0 
    print c 
} 
NF>1 { 
    if($0 in a) 
     c-- 
    else { 
     a[$0] 
     print 
    } 
}' file 
1000727888004 
522101 John Smith 
522188 Shelly King 
1000727888002 
522990 John Doe 
1000727888001 
Verwandte Themen