Создание дампов файлов на основе определенного слова

Создание дампов файлов на основе определенного слова

У меня есть файл:

begin  
path: good  
take this way  
easier path
end  

begin  
path: bad  
You shouldn't go there  
end

begin  
path: good  
Very smooth   
end

begin  
path: bad  
you may face problem  
end  

На основе пути мне нужно создать файл:

хорошо.txt

begin  
path: good  
take this way
easier path 
end 

begin  
path: good  
Very smooth   
end

Возможно ли это только с помощью unixкоманды типа grep awk sed sort?

решение1

В самом простом случае, предполагая, что формат записей «пути» точно такой, как показано, вы можете использовать awkврежим абзаца

awk '{print > $3".txt"}' RS= ORS='\n\n' file

решение2

В Linux можно использовать ряд различных инструментов:

  • sh|bash|ksh|csh- или какая-то другая оболочка
  • awk
  • perl
  • python(зависит от того, установлен ли он)

Или любая комбинация вышеперечисленных инструментов.

Возможное решение с использованием bashи sed, см. примечания после ограничений/допущений:

#!/bin/bash
IN_FILE="$1"   ## Argument: test.txt
OUT_FILE=

# See done for
while read LINE
do
    case $LINE in
        begin)
            OUT_FILE=
            ;;

        path:*)
            OUT_FILE=$(echo "$LINE" | sed 's/^path: \(.*\)/\1/g').txt
            ## TODO: Do a first-seen OUT_FILE check and truncate file.
            echo "begin" >> "$OUT_FILE"   # TODO: Write from buffer instead
            echo "$LINE" >> "$OUT_FILE"
            ;;

        *)
            if [ ! -z "$OUT_FILE" ]
            then
                echo "$LINE" >> "$OUT_FILE"
            else
                ## TODO: Append to a buffer
            fi
           ;;
    esac
done < "$IN_FILE"

ПРИМЕЧАНИЕ: Приведенный выше код выдал ожидаемый результат, но я не проверял его, чтобы убедиться в полноте логики и отсутствии ошибок.

Он также имеет следующие ограничения и проблемы:

  • Добавляет к .txtфайлам, даже если они уже существуют (по запросу может быть добавлена ​​проверка уникальности)
  • Предполагает, что beginпредшествует path:..и может, следовательно, игнорировать эту строку из ввода и записывать ее, когда встречается path. Можно было бы создать переменную, BUFFERно я этого не сделал на данный момент.
  • Возможно, отсутствуют некоторые проверки для пустого OUT_FILE.

Связанный контент