Weitere Duplikate finden

Weitere Duplikate finden

Ich habe eine riesige Liste wie

67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15

ich möchte weiter suchen. Doppelte Zahlen nach der 2. und vor der 3.

für die erste Zeile ist die Nummer 5450-7938-7992-5530und für die nächste Zeile 4532-4142-5613-9690usw.

Antwort1

Betrachten Sie das folgende Awk-Skript duplicates.awk:

#!/usr/bin/awk -f
BEGIN {
    RS = "(\r\n|\n\r|\r|\n)"
    FS = "[\t\v\f ]*;[\t\v\f ]*"
    split("", count)
}

{
    count[$3]++
}

END {
    for (item in count) {
        if (count[item] > 1)
            printf "%s\n", item
    }
}

Denken Sie daran, es ausführbar zu machen, z. B. mit chmod a+rx duplicates.awk. Sie können die Eingabe entweder an den Befehl weiterleiten oder eine oder mehrere Eingabedateien als Befehlszeilenparameter angeben (mehrere Dateien werden so behandelt, als wären sie zu einer einzigen Datei verkettet).

Die BEGIN-Regel richtet universelle Zeilenumbrüche ein (das heißt, sie akzeptiert alle Zeilenumbruchkonventionen von MS-DOS über alte Macs bis hin zu Unix) und Semikolons ;als Feldtrennzeichen. Zur Veranschaulichung habe ich das Feldtrennzeichen so eingestellt, dass es auch alle umgebenden Leerzeichen berücksichtigt, sodass x;foo bar ; yes in drei Felder aufgeteilt wird: x, foo bar, und y.

Die Datensatzregel (der mittlere Teil des Snippets) wird auf jeden Datensatz (Zeile) in der Eingabe angewendet. Da awk assoziative Arrays unterstützt, verwenden wir einfach das dritte Feld, eine Zeichenfolge, als Schlüssel für das countArray und erhöhen diesen Eintrag um eins. (Das Erhöhen eines nicht vorhandenen Array-Eintrags in awk ergibt 1, sodass das erste Inkrement 1 ergibt und der Code wie erwartet funktioniert.)

Die END-Regel durchsucht das countArray und druckt die Einträge aus, die mindestens zweimal aufgetreten sind. Beachten Sie, dass diese Ausgabe in zufälliger Reihenfolge erfolgt. (Es gibt Möglichkeiten, die Ausgabe nach der Anzahl der Vorkommen zu sortieren oder sogar die ursprüngliche Reihenfolge (der ersten Vorkommen) in der Datei beizubehalten, aber OP erwähnte keine Anforderung bezüglich der Reihenfolge, also habe ich mir die Mühe nicht gemacht; eine undefinierte Reihenfolge ist am einfachsten zu implementieren.)

Wenn Sie beispielsweise die Anzahl der Vorkommen gefolgt von der Zeichenfolge (dem Wert aus der dritten Spalte) drucken möchten, verwenden Sie stattdessen die folgende END-Regel:

END {
    for (item in count)
        printf "%15d %s\n", count[item], item
}

Die Ausgabe wird so formatiert, dass die ersten fünfzehn Zeichen in der Ausgabe für die Zahl reserviert sind und der Wert beim 17. Zeichen beginnt.

Antwort2

Erstellen einiger doppelter Werte in der Datei stack.txt und anschließendes Drucken der Ausgabe -

67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15

Verwenden Sie den folgenden Befehl -

 awk 'BEGIN{FS=";"}{a[$3]++} END {for(k in a) print  a[k],k}' stack.txt

Ausgabe -

3 4532-4142-5613-9690
2 5292-4905-4356-2840
3 5450-7938-7992-5530
2 4556-9998-5999-3300

verwandte Informationen