Na sua forma mais simples, assumindo que o formato dos registros de "caminho" é exatamente como mostrado, você pode usar awk
no modo de parágrafo
awk '{print > $3".txt"}' RS= ORS='\n\n' file
Eu tenho um arquivo:
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
Com base no caminho, preciso criar um arquivo:
good.txt
begin
path: good
take this way
easier path
end
begin
path: good
Very smooth
end
Isso é possível usando somente o comando unix
, como grep
awk
sed
sort
?
Na sua forma mais simples, assumindo que o formato dos registros de "caminho" é exatamente como mostrado, você pode usar awk
no modo de parágrafo
awk '{print > $3".txt"}' RS= ORS='\n\n' file
Existem várias ferramentas diferentes que você pode usar no linux:
sh|bash|ksh|csh
- ou algum outro shell awk
perl
python
(depende da sua instalação) Ou qualquer combinação das ferramentas acima.
Possível solução usando bash
e sed
, consulte as notas após as limitações / suposições:
#!/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: \(.*\)//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"
OBSERVAÇÃO: O código acima produziu a saída esperada, mas ainda não a analisei para garantir que a lógica esteja completa / livre de erros.
Ele também tem as seguintes limitações e problemas:
.txt
arquivos, mesmo que eles já existam (uma verificação de unicidade pode ser adicionada a pedido) begin
precede path:..
e pode, portanto, ignorar essa linha da entrada e escrevê-la quando o caminho é encontrado. Seria possível criar uma variável BUFFER
, mas ainda não fiz isso.