Bash correspondência e escrita de texto

0

Eu tenho vários arquivos txt seqüenciados. Eles têm dados específicos que eu preciso reunir em um arquivo de saída.

Por exemplo:

1.txt

     Colour:    Red

     Hight:     10

2.txt

     Colour:    Blue

     Hight:     12

Como posso usar comandos bash, como sed / grep, para procurar palavras específicas e ignorar alguns caracteres para obter os dados e colocá-los em um arquivo de saída.

Por exemplo:

out.txt

     Colour    Hight

      Red        10

      Blue       12

Obrigado por ajudar Anees

    
por Anees 29.10.2015 / 01:06

2 respostas

1

Supondo que sempre haja 2 campos por arquivo e sempre na mesma ordem, veja uma maneira de fazer isso com o sed:

#!/bin/sh

printf '%s\t%s\n' Colour Hight

sed '

    / *Colour: */ {
        s///
        h
        n
    }

    / *Hight: */ {
        s///
        G
        s/\n/\t/g
    }

' "$@"

Esta resposta usa o recurso hold space do sed para salvar os valores de dados de uma linha para a próxima.

Usamos o agrupamento de instruções com { e } . Todos os comandos do grupo aplicam-se apenas às linhas endereçadas, neste caso, as linhas selecionadas pelos padrões / *Colour */ e / *Hight */ .

Nas linhas Color e Hight, primeiro excluímos o texto que foi correspondido ( *Colour * ou *Higth * ) com s/// .

Na linha Color, retemos h do texto restante no hold space e, em seguida, passamos para a próxima linha de entrada sem imprimir ( n ).

Na linha Hight, obtemos / anexamos G do conteúdo do espaço de armazenamento ao espaço de padrão, concatenado com uma nova linha '\ n' por sed . Em seguida, substituímos uma guia \t para essa nova linha e sed imprime a saída.

Esta resposta deve funcionar com todas as versões de sed , seja no Linux, FreeBSD ou OS X.

    
por 29.10.2015 / 01:41
0

Você pode colocar o cabeçalho do arquivo de saída como echo 'Colour Hight' > out.txt
E então para cada arquivo você pode fazer algo como:
awk '{printf $2" ";next;}' 1.txt >> out.txt
Ou para todos os arquivos txt que você pode fazer:
ls *.txt | xargs awk '{printf $2" ";if (++onr%2 == 0) print "";next;}' >> out.txt

    
por 29.10.2015 / 04:52