эффективное разбиение одного файла на несколько файлов по значению столбца

1

У меня есть текстовый файл с разделителями табуляции, который очень большой. Многие строки в файле имеют одинаковое значение для одного из столбцов в файле (назовем его столбцом k). Я хочу разделить этот файл на несколько файлов, помещая записи с тем же значением k в том же файле. Как я могу это сделать? Например:

a foo
1 bar
c foo
2 bar
d foo

следует разделить на файл "foo", содержащий записи "a foo" и "c foo" и "d foo" и файл с названием "bar", содержащий записи "1 bar" и "2 bar".

как это сделать в оболочке script или в Python?

спасибо.

  • 0
    Насколько велик ваш файл?
  • 0
    4 миллиона строк
Теги:

3 ответа

8
Лучший ответ

Я не уверен, насколько он эффективен, но быстрый и простой способ - использовать способ перенаправления файлов в awk:

awk '{ print >> $5 }' yourfile

Это добавит каждую строку (немодифицированную) в файл с именем column 5. При необходимости отрегулируйте.

  • 0
    Это, наверное, очень эффективно. Если нет, попробуйте mawk.
  • 0
    Используйте оператор >> если вы добавляете в существующий файл. Более «AWKish» - использовать оператор > который создаст новый файл или перезапишет существующий при первой записи, но добавит при последующих записях во время того же вызова (если не вызывается close() ). Вот как я это сделаю: awk '{print > "/path/to/" $5 ".extension"}' yourfile
Показать ещё 3 комментария
7

Это должно работать с вашей спецификацией

awk '{outFile=$2; print $0 > outFile}' BigManegyFile

Надеюсь, это поможет.

  • 0
    Вы можете опустить $0 так как это по умолчанию.
  • 1
    Да, это компромисс. На мой взгляд, это делает его более самодокументированным, но я понимаю другие точки зрения.
1

После запуска обеих версий вышеперечисленных команд awk (+ с ошибкой awk) и просмотра запроса на версию python я приступил к короткому и не особо трудному пути к написанию утилиты для простого разделения файлов на основе ключей.

Github repo: https://github.com/gstaubli/split_file_by_key

Фоновая информация: http://garrens.com/blog/2015/04/02/split-file-by-keys/

Ошибка Awk:

awk: 14 makes too many open files
 input record number 4555369, file part-r-00000
 source line number 1
  • 0
    Спасибо Гаррен! Я на самом деле получаю ту же ошибку при попытке использовать Python с большим файлом (слишком много открытых файлов) ... Я ищу, есть ли способ решить, начиная с вашей работы.
  • 0
    @ user971102 Недавно я реорганизовал эту утилиту, чтобы больше не требовать отсортированный входной файл. Я предполагаю, что вы попробовали мое новейшее изменение, которое хранит все открытые средства записи файлов в памяти. Два способа облегчить эту проблему: попробуйте мою старую версию (для которой потребуется разделить входной файл по ключам для разделения). Или, в идеале, я обновлю утилиту (или вы можете) до чего-то вроде LRU-кэша последних файлов, а затем снова откройте для существующих файлов (как дополнение), заменив самую старую программу записи файлов в кэше.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню