Analisa o arquivo com Awk somente quando a primeira linha corresponde ao padrão

1

Eu preciso interrogar o cabeçalho de um arquivo CSV e, se houver uma coluna, continue com as linhas de dados. Contexto é quando os dados contêm colunas dependendo de quando e o que foi emitido.

Esperando que uma solução Awk "pura" mantenha a lógica de negócios em um idioma comum, mas se isso não for possível, os interessados em abordagens que entregam seletivamente arquivos com o cabeçalho correspondem ao script Awk.

Usar a versão mais recente do Gawk é sempre uma opção.

Editar para adicionar pseudo código:

se a coluna no cabeçalho (NR == 1): prossiga com o resto do arquivo, senão pare o arquivo de processamento

    
por MattK 15.02.2016 / 18:20

3 respostas

2

para listar arquivos:

tente

awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |

que selecionará todos os arquivos com o valor que estiver na coluna.

Se você tem um nome engraçado, basta adicionar aspas.

awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |

para processar um arquivo

awk 'NR == 1 && $4 != "whatever" { exit ;}  other patterns { other action;}' file

para processar muitos arquivos

awk 'NR == 1 && $4 != "whatever" { nextfile ;}  other patterns { other action;}' file1 ... filen

que pode ser lido como

  • SE (condição não atendida) NR == 1 && $4 != "whatever"
  • ENTÃO, pule este arquivo { nextfile ;}
  • ELSE avance other patterns { other action;}
por 15.02.2016 / 19:04
2

Supondo um arquivo simples, delimitado por vírgula, onde cada vírgula é um delimitador (alguns arquivos csv podem ter aspas que não devem ser tratadas como seperatores de campo), o seguinte imprime todas as linhas, exceto o cabeçalho, quando uma coluna no cabeçalho é "SOMESTRING":

awk -F, '
    FNR==1 {
        for (i=1; i<=NF; i++) 
            if ($i == "SOMESTRING")
                next
        nextfile
    }
    1
' file1 file2 file3 file4

A comparação de string pode ser substituída por um teste de substring ou uma operação de correspondência de expressão regular, se apropriado.

nextfile não faz parte do POSIX AWK, mas é difundido; está disponível em pelo menos gawk, nawk (usado em sistemas * BSD), mawk e busybox.

    
por 15.02.2016 / 20:20
1

awk 'FNR==1 && ! /whatever/ { nextfile } ; ...remainder of awk script here...' list_of_files_to_process

Isso deve pular para o próximo arquivo a ser processado, a menos que "whatever" esteja na linha 1.

Não me lembro se nextfile é uma extensão GNU awk ou se está disponível em outros awks também. A página mawk man não menciona isso, mas é mencionada na página do manual para original-awk . Se for importante para você, verifique antes de confiar no recurso.

Se você estiver usando o GNU awk, talvez queira colocar esse teste em um bloco BEGINFILE como:

 BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
 ... remainder of awk script here ...
    
por 16.02.2016 / 03:47

Tags