7

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

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

Спасибо!

Глехния 10
Глехния 22
glehniae 343
Глехния 923
гли 1171
гли 2283
гли 3466
Глейб 914
Глейбер 652
Гляйберг 495
гляйберг 709

4 ответа4

5

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

awk '($1 == last) || (last == "") {sum += $2}
     ($1 != last) && (last != "") {print last " " sum; sum = $2}
                                  {last = $1}
     END                          {print last " " sum}' huge_text_file.txt
2

Этот тип запросов наиболее легко и гибко выполняется в SQL. Вы можете использовать SQLet и SQLite для этой цели:

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

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

-- Quick and dirty - no error checking, unsorted output

io.input('huge_text_file.txt')

results = {}

for line in io.lines() do
    for text, number in string.gmatch(line, '(%w+)%s+(%d+)') do
        results[text] = (results[text] or 0) + number
    end
end

for text, number in pairs(results) do
    print(text, number)
end

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

1

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

cat file | uniq -u -c

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .