Analisar arquivo com Awk somente quando a primeira linha corresponder ao padrão

Analisar arquivo com Awk somente quando a primeira linha corresponder ao padrão

Preciso interrogar o cabeçalho de um arquivo CSV e, se existir uma coluna, prosseguir com as linhas de dados. Contexto é quando os dados contêm colunas dependendo de quando e o que os emitiu.

Esperando por uma solução Awk "pura" para manter a lógica de negócios em uma linguagem comum, mas se isso não for possível, estou interessado em abordagens que entreguem seletivamente arquivos com o cabeçalho correspondente ao script Awk.

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

Edite para adicionar pseudocódigo:

se a coluna estiver no cabeçalho (NR == 1): prossiga com o restante do arquivo, caso contrário, pare de processar o arquivo

Responder1

para listar arquivos:

tentar

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

que selecionará todos os arquivos que estiverem na quarta coluna.

Se você tiver 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 poderia ser lido como

  • SE (condição não atendida)NR == 1 && $4 != "whatever"
  • ENTÃO pule este arquivo{ nextfile ;}
  • OUTRO prossigaother patterns { other action;}

Responder2

Supondo um arquivo simples delimitado por vírgulas, onde cada vírgula é um delimitador (alguns arquivos csv podem ter vírgulas entre aspas que não devem ser tratadas como separadores 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 strings 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; ele está disponível pelo menos em gawk, nawk (usado em sistemas *BSD), mawk e busybox.

Responder3

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 "qualquer coisa" esteja na linha 1.

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

Se você estiver usando o GNU awk, você pode querer colocar esse teste em um BEGINFILEbloco como:

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

informação relacionada