4

Мои данные выглядят так:

60  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
61  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
62  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
63  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
64  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Я хочу разделить его на отдельные файлы с помощью префикса строки .. вот так:

file 60 contains all lines prefixed with "60"
file 61 contains all lines prefixed with "61"
...

Наилучшая идея, которую я придумала до сих пор, заключалась в том, чтобы выполнить grep для всех префиксов строки, затем выполнить циклический просмотр и grep каждого из них в отдельный файл, но это довольно большой файл, так что это может занять очень много времени. Возможно, есть лучший способ, чем зацикливание? Какой-то способ группировки grep? Я знаю, что есть способ разрезать файл, если между каждым разделом есть маркеры, например - но я не совсем уверен, что это лучший способ.

1 ответ1

9

Если входной файл называется data , одним из решений является:

awk '{print>$1}' data

В awk первое поле (столбец) называется $1 . Вышеприведенный цикл проходит по каждой строке ввода (awk делает это неявно) и записывает эту строку в файл, имя которого является первым полем.

Более подробно:

  • Команда помещена в фигурные скобки. Поскольку перед скобками нет спецификатора, команда будет выполняться в каждой строке ввода.

  • Команда print без аргумента напечатает всю строку ввода.

  • Символ > указывает на перенаправление вывода в файл

  • Имя файла указывается как $1 что, опять же, относится к любому тексту, который был в первом поле строки ввода.

Таким образом, эта команда создаст файлы с именами 60, 61 и т.д., Которые будут содержать соответствующие строки из входного файла.

Обработка очень больших наборов данных

По умолчанию awk сохраняет все дескрипторы файлов открытыми, пока не завершится вся команда. Следовательно, с очень большими наборами данных возможно превышение системных ограничений на количество открытых файлов. Самое простое решение - добавить и закрыть каждый файл после записи:

awk '{print>>$1; close($1)}' data

Поскольку при этом используется >> (добавление), это добавит к существующим файлам данных, а не перезапишет их. Если это не то, что вы хотите, удалите их перед запуском этой команды.

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