Despejo de arquivos com base em uma palavra específica

0

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 ?

    
por Mishkat Hasan 02.11.2016 / 16:10

2 respostas

1

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
    
por 02.11.2016 / 17:49
0

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:

  • Será anexado a .txt arquivos, mesmo que eles já existam (uma verificação de unicidade pode ser adicionada a pedido)
  • Assume que 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.
  • Está possivelmente faltando algumas verificações para OUT_FILE em branco.
por 02.11.2016 / 16:21