Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Использование AWK для разбиения частей одного файла на несколько файлов, но мне нужно дальнейшее направление

Автор вопроса: Josh HОтветов: 2

Я все еще новичок в этом типе задач, но я исчерпал свои ресурсы и поэтому протягиваю руку помощи.

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

awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile

НО -

  1. Если возможно, я хотел бы указать каталог для выходных файлов - приведенный выше сценарий записывает выходные файлы в каталог "sourceFile", я бы хотел, чтобы эти файлы были сброшены в какой-то временный каталог.

  2. Было бы чрезвычайно полезно, если бы выходные файлы могли сохранять свое имя "sourceFile", возможно, со счетчиком в конце, сохраняя при этом тип файла .txt, то есть sourceFile1.txt, sourceFile2.txt и т. д.

Я попытался сохранить имя исходного файла, но безуспешно:

set F=sourceFile
awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile

Прошу прощения, если это элементарно, но это может сильно помочь в повседневных задачах, поэтому я надеялся, что кто-то может помочь. Заранее спасибо!

  • возможный дубликат разбитых файлов AWK на более мелкие файлы по шаблону mschilli 07.09.2013

splitawk

Ответы

Ответ 1 · рейтинг 1 · Kent

awk может принимать переменные оболочки, если вы хотите установить каталог и имя файла:

D="/path/to/newfiles/"
F="sourceFile"

awk -v d="$D" -v f="$F" '/PATTERN/{x=d f (++i)}{print > x;}' sourceFile

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

но есть еще одна вещь, на которую следует обратить внимание. сколько PATTERN в вашем файле. если их слишком много, вы увидите сообщение об ошибке, например, "открыто слишком много файлов". в этом случае вы должны закрыть последний файл перед записью в новый.

Ответ 2 · рейтинг 1 · Chris Seymour

Вы в значительной степени там просто добавляете префикс имени файла к каталогу и добавляете расширение файла, используя конкатенацию строк:

awk '/PATTERN/{file="tmp/"(FILENAME)(++i)".txt"}{print > file}' sourceFile

Нам не нужно использовать переменную оболочки для входного файла, вместо этого мы можем использовать переменную awk FILENAME.

Демонстрация:

$ cat sourceFile
PATTERN sf1
sf1
sf1
sf1
PATTERN sf2
sf2
sf2
PATTERN sf3
sf3
sf3

$ awk '/PATTERN/{file="tmp/"(FILENAME)(++i)".txt"}{print > file}' sourceFile

$ cat tmp/sourceFile1.txt
PATTERN sf1
sf1
sf1
sf1

$ cat tmp/sourceFile2.txt
PATTERN sf2
sf2
sf2

$ cat tmp/sourceFile3.txt
PATTERN sf3
sf3
sf3

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы