Я все еще новичок в этом типе задач, но я исчерпал свои ресурсы и поэтому протягиваю руку помощи.
У меня есть один файл, состоящий из объединенных файлов. Я могу использовать точную строку кода ниже, чтобы разбить файлы на части:
awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile
НО -
Если возможно, я хотел бы указать каталог для выходных файлов - приведенный выше сценарий записывает выходные файлы в каталог "sourceFile", я бы хотел, чтобы эти файлы были сброшены в какой-то временный каталог.
Было бы чрезвычайно полезно, если бы выходные файлы могли сохранять свое имя "sourceFile", возможно, со счетчиком в конце, сохраняя при этом тип файла .txt, то есть sourceFile1.txt, sourceFile2.txt и т. д.
Я попытался сохранить имя исходного файла, но безуспешно:
set F=sourceFile
awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile
Прошу прощения, если это элементарно, но это может сильно помочь в повседневных задачах, поэтому я надеялся, что кто-то может помочь. Заранее спасибо!
Ответ 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