Pergunta

Tenho que lidar com arquivos de texto em uma seleção heterogênea de formatos.Aqui está um exemplo (Colunas A e B são delimitados por tabulações):

A   B
a   Name1=Val1, Name2=Val2, Name3=Val3
b   Name1=Val4, Name3=Val5
c   Name1=Val6, Name2=Val7, Name3=Val8

Os arquivos podem ter cabeçalhos ou não, ter esquemas de delimitação mistos, ter colunas com pares nome/valor como acima etc.
Muitas vezes tenho a necessidade ad hoc de extrair dados desses arquivos de várias maneiras.Por exemplo, a partir dos dados acima, posso querer o valor associado a Name2 onde ele estiver presente.ou seja

A   B
a   Val2
c   Val7

Quais ferramentas/técnicas existem para realizar manipulações como comandos de uma linha, usando o exemplo acima, mas extensíveis a outros casos?

Foi útil?

Solução

Eu não gosto sed demais, mas ele funciona para essas coisas:

var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename

Dá-lhe:

 A B
 a Val2
 c Val7

Outras dicas

Você tem todos os comandos básicos do shell bash, por exemplo grep, cut, sed e awk à sua disposição. Você também pode usar Perl ou Ruby para coisas mais complexas.

Pelo que tenho visto eu começaria com Awk para este tipo de coisa e, em seguida, se você precisar de algo mais complexo, eu progredir para Python.

Gostaria de usar sed:

   # print section of file between two regular expressions (inclusive)
   sed -n '/Iowa/,/Montana/p'             # case sensitive

Uma vez que você tem o cygwin, eu iria com Perl. É o mais fácil de aprender (confira o livro Ou'Reily: Learning Perl ) e amplamente aplicável.

Gostaria de usar Perl. Escreva um pequeno módulo (ou mais de um) para lidar com os diferentes formatos. Você pode então executar perl Oneliners utilizando essa biblioteca. Exemplo para o que seria parecido com o seguinte:

perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'

Não citar-me sobre a sintaxe, mas essa é a idéia geral. Resumo da tarefa em mãos para que você possa pensar em termos do que você precisa fazer, não como você precisa fazê-lo. Rubi seria outra opção, ele tende a ter uma sintaxe mais limpa, mas de qualquer linguagem iria funcionar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top