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 prossiga
other 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 mawk
pá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 BEGINFILE
bloco como:
BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
... remainder of awk script here ...