SQL wie Gruppieren nach und Summe für Textdateien in der Befehlszeile?

6671
dnkb

Ich habe riesige Textdateien mit zwei Feldern, der erste ist eine Zeichenfolge, der zweite eine Ganzzahl. Die Dateien werden nach dem ersten Feld sortiert. Was ich in der Ausgabe erhalten möchte, ist eine Zeile pro eindeutiger Zeichenfolge und die Summe der Zahlen für die identischen Zeichenfolgen. Einige Zeichenfolgen werden nur einmal angezeigt, andere wiederum mehrmals. ZB angesichts der folgenden Beispieldaten möchte ich für die Zeichenfolge Glehnia 10 + 22 = 32 im Ergebnis erhalten.

Irgendwelche Vorschläge, wie man dies entweder mit gnuwin32-Befehlszeilentools oder in der Linux-Shell erledigt?

Vielen Dank!

glehnia 10
glehnia 22
glehniae 343
glehnii 923
glei 1171
glei 2283
glei 3466
gleib 914
gleiber 652
gleiberg 495
gleiberg 709

7
Doppelte Frage unter http://stackoverflow.com/q/10286522/424651 mit ähnlichen Antworten, aber die [höchst gewählte Antwort] (http://stackoverflow.com/a/10286592/424651) gibt es knapper als die akzeptierte Antwort unten (beide sind awk-Programme). chbrown vor 9 Jahren 0

4 Antworten auf die Frage

5
Jukka Matilainen

In AWK könnten Sie so etwas tun:

awk '($1 == last) || (last == "")  ($1 != last) && (last != "")   END ' huge_text_file.txt 
Vielen Dank! Ich musste ein wenig anpassen, um TAB als Trennzeichen zu verwenden, aber es brachte mir den Kickstart! dnkb vor 14 Jahren 0
@dnkb: Using a comma in your print statements allows you to set the output field separator and then print will use it automatically. This may be what you did: `awk 'BEGIN ($1 == last || last == "") ($1 != last && last != "") END ' huge_text_file.txt` Dennis Williamson vor 14 Jahren 1
2
Tomas

Diese Art von Abfragen kann am einfachsten und flexibelsten in SQL ausgeführt werden. Sie können SQLet und SQLite für diesen Zweck verwenden:

sqlet.py -d' ' -A file1.txt 'select a1, sum(a2) from A group by a1' | sqlite3 
1
Mike Fitzpatrick

Sie könnten ein paar Zeilen Lua verwenden, um dies zu erreichen. Lua ist auf einer Vielzahl von Plattformen verfügbar, einschließlich Windows und Linux.

- Schnell und verschmutzt - keine Fehlerprüfung, unsortierte Ausgabe  io.input ('huge_text_file.txt')  Ergebnisse = {}  für Zeile in io.lines () tun für Text, Zahl in Zeichenfolge.gmatch (Zeile, '(% w +)% s + (% d +)') Ergebnisse [Text] = (Ergebnisse [Text] oder 0) + Nummer Ende Ende  für Text die Anzahl in Paaren (Ergebnisse) Druck (Text, Nummer) Ende 

Sie können die Ausgabe mit einem beliebigen Sortierprogramm oder einigen weiteren Zeilen von Lua sortieren.

1
Tom

Sie können zum Beispiel den Befehl uniq verwenden

cat file | uniq -u -c 

Dabei gilt: -c - Anzahl der Vorkommen -u - Nur eindeutige Zeilen drucken

hast du die frage gelesen Tomas vor 10 Jahren 1