У меня есть файл:
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.