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

У меня есть файл, как показано ниже:

###PSTERS### LINE1 LINE2 ###PSTADS### LINE3 LINE4 ###PSTEEE### LINE5 LINE6 

Мне нужно сгенерировать 3 файла, как будто (имена файлов – это шаблон, который мы ищем):

PSTERS.txt:

 LINE1 LINE2 

PSTADS.txt:

 LINE3 LINE4 

PSTEEE.txt:

 LINE5 LINE6 

Как я могу это сделать? Я попробовал сценарий ниже, но он не работает с синтаксической ошибкой awk:

 #!/bin/bash #This script will take 2 parameters as input. # 1. Source File Path # 2. Source File name as input SOURCE_PATH=$1 SOURCE_FILE=$2 #Get the list of patterns we need to check from the Main source file cd $SOURCE_PATH pattern_list=`grep -e '^\#' $SOURCE_FILE | cut -d'#' -f4` echo ${pattern_list} #Split the Source File for each pattern in the variable pattern_list for pattern in ${pattern_list} do cd $SOURCE_PATH awk '/\#\#\#'$pattern'/{x='$pattern';next}{print > x;}' $SOURCE_FILE done 

2 Solutions collect form web for “Разделить файлы на основе поиска шаблонов. Разделить имя файла с помощью шаблона, который мы искали”

Вы принимаете очень сложный подход. Нет необходимости в скрипте оболочки, это однострочный awk :

 awk '{if(gsub(/#+/,"")){name=$0;}else{print > name".txt"}}' file 

gsub – это «глобальная замена». Таким образом, это означает, что «если строка имеет номер # , удалите их (замените ничем) и установите переменную« имя »в содержимое строки». Так как теперь строка будет оставлена ​​после удаления # , name будет шаблоном. Затем, если строка не соответствует # (если сбой замены), напечатайте строку в файл, имя которого является текущим значением name и .txt .

Если вам все еще нужен сценарий оболочки, просто используйте:

 #!/bin/bash - #This script will take 1 parameter as input: the target file path targetFile="$1" targetDir=$(dirname -- "$targetFile") targetFile=$(basename -- "$targetFile") cd -P -- "$targetDir" || exit awk '{if(gsub(/#+/,"")){name=$0;}else{print > name".txt"}}' < "$targetFile" 

Мы можем использовать relative addressing редактора ed чтобы снять это.

Задача включает извлечение номера строки всех # строк во входном файле в первый проход. Затем мы создаем серию команд ed чтобы выполнить работу. Правая сторона отображает содержимое пространства шаблонов, когда оно формируется с помощью скринсейвера sed

 sed -e '$s/.*/$/;$q;/^#/!d;=' inputfile | sed -e ' N;N;h; # ps: 1\n###PSTERS###\n4$ s/^[1-9][0-9]*/&+/; /\$$/!s/$/-/; # ps: 1+\n###PSTERS###\n4-$ s/\n\(.*\)\n\(.*\)/,\2w \1.txt/; # ps: 1+,4-w ###PSTERS###.txt$ s/#//gp;g; # ps: 1+,4-w PSTERS.txt s/.*\n/\n/; $!D; s/.*/q/ ' | ed -s - inputfile 
  • Извлечь имена хостов из не хэшированных ssh known_hosts
  • Как эхо из определенной строки файла в другую определенную строку
  • Как awk разрезать определенные поля и добавить к концу каждой строки?
  • Передача переменных в шаблоны диапазонов в awk
  • Awk: диапазон PID
  • переменная оболочки в awk не передается всем строкам, а только для самой первой строки ввода?
  • Чтение текстового файла; Копирование текстовой строки без отступов; Заменить начало отступов с указанным текстом
  • Diff, показать измененную строку только из правого файла
  • Как добавить некоторую строку в соответствие с предыдущей строкой, сопоставленной с sed?
  • как захватить последнюю версию ядра из grub.conf
  • Добавьте столбец в CSV, который представляет собой сумму двух предыдущих столбцов
  • Linux и Unix - лучшая ОС в мире.