Разделить текстовый файл на несколько, когда появляется шаблон, с командной строкой в ​​linux

Для тестирования только в терминале используйте:

sed '/[cr]at/d' file_name

Чтобы действительно удалить эти строки из файла, используйте:

sed -i '/[cr]at/d' file_name
1
задан 1 October 2015 в 02:59

2 ответа

Поскольку @muru избил меня до решения awk, вот подход Perl (но вместо этого используйте @ Muru, он проще и эффективнее):

perl -00ne 's#PAT.*/(.*)\n##; open($F,">","$1.txt"); s/\n\s*(\n|$)//g; 
            print $F "$_\n"' original.txt 

-00 делает [ f6] обрабатывать абзацы как строки: «строка» («запись») представляет собой абзац, определенный пустой строкой. s#PAT.*/(.*)\n## удалит строку, начиная с PAT из записи, а скобки будут записывать последнее слово после / как $1. Затем мы открываем $1.txt для записи (open($F,">","$1.txt")) с файлом ручка $F. Следующий шаг, s/\n\s*\n//g; удаляет пустые строки и, наконец, текущая запись печатается в дескрипторе файла $F с помощью print $F "$_\n".

Чтобы использовать все после [ f17] как имя, попробуйте:

perl -00ne 's#PAT.*//(.*)\n##; $k=$1; $k=~s#[./]##g;open($F,">","$k.txt"); 
              s/\n\s*(\n|$)//g; print $F "$_\n"' original.txt 

На вашем примере это приведет к следующим файлам:

askubuntucompage01.txt
askubuntucompage02.txt
askubuntucompage03.txt
3
ответ дан 23 May 2018 в 17:03
  • 1
    Ваше предложение очень ценится! Что, если бы я хотел получить имя результирующих файлов вместо того, чтобы начинать с последнего косая черта, он начинался с предыдущих двойных слэшей, я имею в виду что-то вроде askubuntucompage01.txt, askubuntucompage02.txt, askubuntucompage03.txt? благодаря – tom_len 1 October 2015 в 03:29
  • 2
    @tom_len см. обновленный ответ. Но, опять же, такого рода вещи проще в awk. – terdon♦ 1 October 2015 в 03:33
  • 3
    Мне жаль тердон, но я не знаю, как выполнить эту команду. Не могли бы вы указать шаги, я должен создать файл, содержащий это? – tom_len 1 October 2015 в 03:41
  • 4
    @tom_len нет, просто скопируйте / вставьте его прямо в терминал. То же, что и команда awk. – terdon♦ 1 October 2015 в 03:44
  • 5
    хм, я получаю только один файл, а содержимое внутри неправильно, попробую еще раз завтра – tom_len 1 October 2015 в 03:51

Также посмотрите на csplit (1):

csplit --suppress-matched --prefix page --suffix-format% 02d.txt original.txt '/ ^ PAT /' '{ *}

0
ответ дан 23 May 2018 в 17:03
  • 1
    Я получаю это сообщение и никаких файлов. csplit: непризнанная опция '--suppress-matching' Try 'csplit --help' для получения дополнительной информации. – tom_len 1 October 2015 в 12:31
  • 2
    Похоже, ваша версия csplit не поддерживает эту опцию, или, может быть, имеет другой формат; посмотрите manpage ('man csplit') или вывод справки ('csplit --help'). – Greg 1 October 2015 в 13:40
  • 3
    -b, --suffix-format = FORMAT использовать sprintf FORMAT вместо% 02d -f, --prefix = PREFIX использовать PREFIX вместо «xx» -k, --keep-файлы не удаляют выходные файлы при ошибках -n, --digits = DIGITS использует указанное количество цифр вместо 2-s, --quiet, --silent не печатает количество выходных размерных файлов -z, --elide-empty-files удаляет пустые выходные файлы --help отображает это help и exit - version version version version и exit Это моя версия csplit (GNU coreutils) 8.21 – tom_len 1 October 2015 в 14:34
  • 4
    Привет, Грег, добро пожаловать в askubuntu! Пожалуйста, разместите команду, которую вы разместили в блочном формате, отложив ее четырьмя пробелами. Встроенные команды могут быть блокированы с обратными элементами `command`. Также было бы неплохо хотя бы кратко объяснить, что делает команда. Конечно, RTFM и так далее, но я думаю, что это хороший стиль. – Nephente 1 October 2015 в 15:20
  • 5
    У вас есть старая версия GNU coreutils. Текущая версия - 8,24, но с подстановочным соответствием поддерживается с 8.22. – Greg 1 October 2015 в 15:54

Другие вопросы по тегам:

Похожие вопросы: