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 as:

=====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, quero dividir os dados com base no autor. Deve ser dividido em dois arquivos que contenham:

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:

Eu quero classificar dinamicamente o arquivo principal sample.txt em subarquivos com base no campo do autor.

    
por user2353439 04.06.2013 / 10:49

1 resposta

3

Usando awk , armazene os campos em variáveis. Quando o marcador de registro for alcançado, escreva os campos no arquivo apropriado (usando o nome do autor).

-F: especifica que os campos são delimitados em ":"

Esta linha $1 ~ /author/ { author=$2 } se o primeiro campo de uma linha for "autor" e depois armazenará o valor na variável de autor. Isso é necessário, pois deve haver um autor chamado arquivo para gravar o registro.

Usando substr () para extrair os primeiros cinco caracteres, se o início do marcador de registro "=====" for encontrado, os dados (armazenados na variável rec ) serão gravados no arquivo de autor apropriado .

 awk -F: '
    $1 ~ /author/ { author=$2; }
    {
        if (substr($1,0,5) == "=====" && author != "") {
            print rec >> (author".txt")
            rec=$0; author=""
        }
        else
            rec=rec "\n" $0
    }
    END { if (author != "") print rec >> (author".txt") }
    ' authors.txt
    
por 04.06.2013 / 11:24