SQL как группировка и сумма для текстовых файлов в командной строке?

6337
dnkb

У меня огромные текстовые файлы с двумя полями, первое - строка, второе - целое число. Файлы отсортированы по первому полю. То, что я хотел бы получить в выводе, это одна строка на уникальную строку и сумму чисел для идентичных строк. Некоторые строки появляются только один раз, а другие появляются несколько раз. Например, учитывая приведенные ниже примеры данных, для строки glehnia я хотел бы получить 10 + 22 = 32 в результате.

Любые предложения, как это сделать с помощью инструментов командной строки gnuwin32 или в оболочке Linux?

Спасибо!

Glehnia 10
Glehnia 22
Glehniae 343 Glehnii
923
Glei 1171
Glei 2283
Glei 3466
Gleib 914
Gleiber 652
Gleiberg 495
Gleiberg 709

7
Дублирующий вопрос на http://stackoverflow.com/q/10286522/424651 с аналогичными ответами, но [ответ с наибольшим количеством голосов] (http://stackoverflow.com/a/10286592/424651) там более краткий, чем принятый ответ ниже (обе программы awk). chbrown 9 лет назад 0

4 ответа на вопрос

5
Jukka Matilainen

В AWK вы можете сделать что-то вроде этого:

awk '($1 == last) || (last == "")  ($1 != last) && (last != "")   END ' huge_text_file.txt 
Спасибо! Мне пришлось немного подправить, чтобы использовать TAB в качестве разделителей, но это дало мне толчок! dnkb 14 лет назад 0
@dnkb: Использование запятой в ваших операторах печати позволяет вам установить разделитель выходного поля, и тогда print будет использовать его автоматически. Это может быть то, что вы сделали: `awk 'BEGIN ($ 1 == last || last ==" ") ($ 1! = Last && last! =" ") END 'огромный_текст_файл.txt` Dennis Williamson 14 лет назад 1
2
Tomas

This type of queries are most easily and flexibly done in SQL. You can use SQLet and SQLite for that purpose:

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

Вы можете использовать несколько строк Lua, чтобы добиться этого. Lua доступен на широком спектре платформ, включая Windows и Linux.

- Быстро и грязно - без проверки ошибок, несортированный вывод  io.input ( 'huge_text_file.txt')  результаты = {}  для строки в io.lines () do для текста число в string.gmatch (строка, '(% w +)% s + (% d +)') сделать результаты [текст] = (результаты [текст] или 0) + число конец конец  для текста, число в парах (результаты) сделать печать (текст, номер) конец 

Вы можете отсортировать вывод, используя любую утилиту сортировки или несколько строк Lua.

1
Tom

Вы можете использовать команду uniq, например

cat file | uniq -u -c 

где: -c - количество вхождений -u - выводить только уникальные строки

ты прочитал вопрос? Tomas 10 лет назад 1

Похожие вопросы