Como extrair um registro em um texto na correspondência de seqüência de caracteres em um arquivo usando o bash

0

Eu tenho um arquivo de texto sample.txt como

=====record1
title:javabook
price:$120
author:john
path:d:
=====record2
title:.netbook
author:paul
path:f:
=====record3
author:john
title:phpbook
subject:php
path:f:
price:$150
=====record4
title:phpbook
subject:php
path:f:
price:$150

a partir disso eu quero dividir os dados com base no autor, ele deve dividir em 2 arquivos que contém

test1.txt

=====record1
    title:javabook
    price:$120
    author:john
    path:d:
=====record3
    author:john
    title:phpbook
    subject:php
    path:f:
    price:$150

e

test2.txt

=====record2
    title:.netbook
    author:paul
    path:f:

como acima, eu quero classificar o arquivo principal sample.txt em sub-arquivos com base no campo do autor dinamicamente.

    
por private 04.06.2013 / 10:51

1 resposta

1

#!/bin/bash

tr '\n' ' ' < sample.txt | sed 's:=====:\n=====:g' | sed 's: *$::g' >tmp1

grep "author:john" tmp1 | sed 's: :\n\t:g' > test1.txt
grep "author:paul" tmp1 | sed 's: :\n\t:g' > test2.txt

rm tmp1

o comando "tr" substitui cada nova linha por um espaço (o arquivo inteiro é agora de 1 linha)
isso é canalizado para "sed", o que fará com que todos os "=====" iniciem em uma nova linha. O segundo "sed" excluirá espaços à direita. Tudo isso é enviado para um arquivo temporário. Agora você tem 1 "registro" por linha.

O primeiro "grep" irá ler o arquivo temporário e produzir todos os registros onde "author" é "john", esses registros são canalizados para "sed" que substitui cada espaço por um newline-following-by-tab ( para reproduzir exatamente o layout do OP) e enviá-lo para um arquivo chamado test1.txt

O segundo idem do grep para "paul" e "test2.txt"

A última ação é excluir o arquivo temporário que não é mais necessário,

    
por thom 29.10.2013 / 04:01