Analisa o arquivo de certa linha em diante no bash no Linux

3

Eu tenho um arquivo CSV contendo os seguintes registros:

Name,Phone,Country
John,N/A,USA
Max,N/A,USA

Name,Color,Size
John,Blue,M
Max,Red,S

Como posso ler apenas os registradores de Nome, Cor, Tamanho e em diante, usando o bash?

Além disso, como posso limitar a saída até que ela atinja o EOF ou uma linha em branco? Então isso:

Name,Phone,Country
John,N/A,USA
Max,N/A,USA

Name,Color,Size
John,Blue,M
Max,Red,S

Dummy,Dummy,Dummy
Foo,Foo,Bar

Não produziria isto:

John,Blue,M
Max,Red,S

Dummy,Dummy,Dummy
Foo,Foo,Bar

Mas apenas isso:

John,Blue,M
Max,Red,S

Eu já tentei o grep e o sed mas sem sorte, eu também tentei o tail, mas o número de linhas é desconhecido até o arquivo ser lido.

    
por arielnmz 10.04.2015 / 04:33

2 respostas

2

Usando o awk

$ awk '/^$/{f=0} f{print} /Name,Color,Size/{f=1}' file
John,Blue,M
Max,Red,S

Como funciona

O script awk tem uma variável, f , que serve como um sinalizador para identificar quando estamos dentro de um bloco Name,Color,Size .

  • /^$/{f=0}

    Em uma linha em branco, defina f=0 para sinalizar que estamos fora do bloco Name,Color,Size .

  • f{print}

    Quando estivermos no bloco, f==1 , imprima a linha.

  • /Name,Color,Size/{f=1}

    Quando chegarmos ao cabeçalho Name,Color,Size , defina f=1 para sinalizar que estamos no bloco.

Usando o GNU sed

$ sed -n '/Name,Color,Size/{:a; n; /./{p; ba;}}' file
John,Blue,M
Max,Red,S

Como funciona

  • -n

    Diga ao sed para não imprimir nada, a menos que seja explicitamente solicitado.

  • /Name,Color,Size/{...}

    Se a linha contiver o cabeçalho Name,Color,Size , execute os comandos nas chaves:

    • :a;

      Isso define um rótulo a .

    • n;

      Isto lê a próxima linha.

    • /./{p; ba;}

      Se esta próxima linha não estiver em branco, imprima-a ( p ) e ramifique ( b ) de volta ao rótulo a .

    Desta forma, todas as linhas dentro do bloco serão lidas e impressas e a impressão será interrompida com a primeira linha vazia.

por 10.04.2015 / 06:38
1

Você pode usar sed para mostrar apenas as coisas depois de determinada linha, fazendo algo como

sed -e '0,/Name,Color,Size/d' <file>

para que você veja apenas as linhas que vêm depois de Name,Color,Size

    
por 10.04.2015 / 04:45

Tags