Despejando arquivos com base em palavras específicas

Despejando arquivos com base em palavras específicas

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, tenho que criar um arquivo:

bom.txt

begin  
path: good  
take this way
easier path 
end 

begin  
path: good  
Very smooth   
end

Isso é possível usando apenas unixcomandos como grep awk sed sort?

Responder1

Na sua forma mais simples, assumindo que o formato dos registros do "caminho" é exatamente como mostrado, você poderia usar awkemmodo parágrafo

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

Responder2

Existem várias ferramentas diferentes que você pode usar no Linux:

  • sh|bash|ksh|csh- ou alguma outra concha
  • awk
  • perl
  • python(depende se está instalado)

Ou qualquer combinação das ferramentas acima.

Possível solução usando bashe sed, veja as notas a seguir sobre 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: \(.*\)/\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"

OBSERVAÇÃO: O código acima produziu a saída esperada, mas não o revisei para ter certeza de que a lógica está completa/livre de erros.

Ele também tem as seguintes limitações e problemas:

  • Será anexado aos .txtarquivos mesmo que eles já existam (uma verificação de exclusividade pode ser adicionada mediante solicitação)
  • Assume que o beginprecede path:..e pode, portanto, ignorar essa linha da entrada e escrevê-la quando o caminho for encontrado. Seria possível criar uma BUFFERvariável, mas ainda não fiz isso.
  • Possivelmente estão faltando algumas verificações para OUT_FILE em branco.

informação relacionada