Volcar archivos basados ​​en una palabra específica

Volcar archivos basados ​​en una palabra específica

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 unixun 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 awkenmodo 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ón
  • awk
  • perl
  • python(depende de si está instalado)

O cualquier combinación de las herramientas anteriores.

Posible solución usando bashy 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 .txtlos archivos incluso si ya existen (se puede agregar una verificación de unicidad a pedido)
  • Se supone que beginprecede path:..y, por lo tanto, puede ignorar esa línea de entrada y escribirla cuando encuentre la ruta. Sería posible crear una BUFFERvariable pero no lo he hecho en este momento.
  • Posiblemente falten algunas comprobaciones para OUT_FILE en blanco.

información relacionada