
Tengo un archivo:
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
Según la ruta, tengo que crear un archivo:
bueno.txt
begin
path: good
take this way
easier path
end
begin
path: good
Very smooth
end
¿Es eso posible usando solo unix
un comando como grep
awk
sed
sort
?
Respuesta1
En su forma más simple, suponiendo que el formato de los registros de "ruta" es exactamente como se muestra, podría utilizar awk
enmodo párrafo
awk '{print > $3".txt"}' RS= ORS='\n\n' file
Respuesta2
Hay varias herramientas diferentes que puedes usar en Linux:
sh|bash|ksh|csh
- o algún otro caparazónawk
perl
python
(depende de si está instalado)
O cualquier combinación de las herramientas anteriores.
Posible solución usando bash
y sed
, consulte las notas siguientes sobre limitaciones/suposiciones:
#!/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"
NOTA: El código anterior produjo el resultado esperado, pero no lo he revisado para asegurarme de que la lógica esté completa o libre de errores.
También tiene las siguientes limitaciones y problemas:
- Se agregará a
.txt
los archivos incluso si ya existen (se puede agregar una verificación de unicidad a pedido) - Se supone que
begin
precedepath:..
y, por lo tanto, puede ignorar esa línea de entrada y escribirla cuando encuentre la ruta. Sería posible crear unaBUFFER
variable pero no lo he hecho en este momento. - Posiblemente falten algunas comprobaciones para OUT_FILE en blanco.