Hallo Liste ich habe eine Datei mit SQL-Statements. Ein paar updates, aber hauptsächlich "insert into" Befehle. Ich möchte wissen, wie oft in welche Tabelle geschrieben wurde. Also habe ich mir folgendes überlegt: linux:/tmp # grep -o -E "^[^(]*" statements | uniq -c | sort -n| uniq | tail -n 10 24 insert into Tabelle1 26 insert into Tabelle2 38 insert into Tabelle2 48 insert into Tabelle1 72 insert into Tabelle1 96 insert into Tabelle1 106 insert into Tabelle2 118 insert into Tabelle2 144 insert into Tabelle2 Leider ist das nicht das was ich mir erhofft hatte. Warum werden hier Tabelle1 und Tabelle2 mehrfach aufgeführt, wo uniq -c doch eigentlich gleiche Zeilen zählen sollte? Wenn ich das ganze von Hand nachbaue, sehen die Ergebnisse darüberhinaus völlig anders (und scheinbar korrekt, wenn ich mir das File von Hand anschaue) aus: linux:/tmp # grep -w "insert into Tabelle2" statements | wc -l 28800 linux:/tmp # grep -w "insert into Tabelle1" statements | wc -l 4992 linux:/tmp # grep -v -w "insert into Tabelle1" statements |grep -v -w "insert into Tabelle2" | wc -l 1387 linux:/tmp # wc -l statements 35179 statements linux:/tmp # echo $((1387+28800+4992)) 35179 An "Leerzeichenmist", der uniq durcheinanderbringen könnte, kann es eigentlich auch nicht mehr liegen, weil das Folgende die gleichen Zeilen liefert: linux:/tmp # sed 's/ */ /g' statements | grep -o -E "^[^(]*" | uniq -c | sort -n| uniq | tail -n 10 > datei while read line do echo "\"$line\"" done < datei linux:/tmp # while read line
do echo "\"$line\"" done < datei "24 insert into Tabelle1" "26 insert into Tabelle2" "38 insert into Tabelle2" "48 insert into Tabelle1" "72 insert into Tabelle1" "96 insert into Tabelle1" "106 insert into Tabelle2" "118 insert into Tabelle2" "144 insert into Tabelle2"
Wie man sieht hängt nach "Tabelle1" bzw "Tabelle2" kein Leerzeichen mehr, das sich evtl. hätte einmischen können. Hat uniq einfach ein Problem mit großen Dateien/Datenmengen oder mache ich etwas falsch? Danke und Gruß Dominik
Hm, durch Zufall habe ich es praktisch direkt nach Abschicken der Mail rausbekommen. In "test" sind 11 aufeinanderfolgende Zeilen "insert into Tabelle1 (values ...." und 10 solche für Tabelle2. linux:/tmp # grep -o -E "^[^(]*" test | uniq -c 11 insert into Tabelle1 10 insert into Tabelle2 Das stimmt. Also folgender Test: linux:/tmp # cat test >> test2 linux:/tmp # cat test >> test2 linux:/tmp # cat test >> test2 linux:/tmp # cat test >> test2 linux:/tmp # cat test >> test2 linux:/tmp # cat test >> test2 linux:/tmp # cat test >> test2 Und das Ganze von vorne linux:/tmp # grep -o -E "^[^(]*" test2 | uniq -c 11 insert into Tabelle1 10 insert into Tabelle2 11 insert into Tabelle1 10 insert into Tabelle2 11 insert into Tabelle1 10 insert into Tabelle2 11 insert into Tabelle1 10 insert into Tabelle2 11 insert into Tabelle1 10 insert into Tabelle2 11 insert into Tabelle1 10 insert into Tabelle2 11 insert into Tabelle1 10 insert into Tabelle2 Hm, vielleicht vorher sortieren? linux:/tmp # grep -o -E "^[^(]*" test2 |sort|uniq -c 77 insert into Tabelle1 70 insert into Tabelle2 Und siehe da: linux:/tmp # grep -o -E "^[^(]*" statements|sort|uniq -c|sort -n|uniq|tail -n 2 4992 insert into Tabelle1 28800 insert into Tabelle2 Technik, die begeistert :) Dominik ~
On Friday 06 October 2006 11:47, Dominik Klein wrote:
Hallo Liste
Hallo,
ich habe eine Datei mit SQL-Statements. Ein paar updates, aber hauptsächlich "insert into" Befehle. Ich möchte wissen, wie oft in welche Tabelle geschrieben wurde. Also habe ich mir folgendes überlegt:
linux:/tmp # grep -o -E "^[^(]*" statements | uniq -c | sort -n| uniq | tail -n 10 24 insert into Tabelle1 26 insert into Tabelle2 38 insert into Tabelle2 48 insert into Tabelle1 72 insert into Tabelle1 96 insert into Tabelle1 106 insert into Tabelle2 118 insert into Tabelle2 144 insert into Tabelle2
[...]
Hat uniq einfach ein Problem mit großen Dateien/Datenmengen oder mache ich etwas falsch?
Aus der man page: "Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output). " Also uniq fast nur aufeinanderfolgende Zeilen zusammen. Beispiel: Tab1 Tab1 Tab2 Tab1 Tab2 Tab2 Bei einem uniq -c werden dann die erst beiden Tab1 zusammengefasst und die letzten beiden Tab2. Also: 2 Tab1 1 Tab2 1 Tab1 2 Tab2 Das Ganze muss für Deine Zwecke vorsortiert werden. Bei einem sort | uniq -c kommt daher folgendes raus: 3 Tab1 3 Tab2 Gruß Thomas
participants (2)
-
Dominik Klein
-
Thomas Vollmer