Grepping nomes de contas (lidos de um arquivo) de um conjunto de arquivos compactados

0

Este script:

while read ACCT ; do
echo $ACCT
zgrep -h ^$ACCT datafile.0[2-3]2015.gz >>/tmp/$ACCT.txt
done < /account_list.txt

Eu não recebo nenhum arquivo de saída redirecionado Quando eu removo '>>/tmp/$ACCT.txt' , a saída vai para stdout, o que é esperado. Não estou entendendo por que, neste exemplo, não recebo saída redirecionada. Eu também tentei, em vez de zgrep ...

zcat datafile.0[2-3]2015.gz|grep ^$ACCT>>/tmp/$ACCT.txt... 

mas isso não gera saída.

    
por Mark S James 25.05.2018 / 22:21

1 resposta

0

É difícil depurar um trecho de código sem saber quais dados são inseridos nele. Portanto, abster-me-ei de especular sobre o que poderia estar errado com seu código, além de dizer que ^$ACCT provavelmente deveria ser duplicado, assim como todas as outras ocorrências de $ACCT .

Em vez de chamar zgrep uma vez para cada linha em account_list.txt (descompactar esses arquivos de dados quantas vezes houver linhas nesse arquivo), leia as contas em uma matriz em awk e faça o processamento em um passagem única:

awk 'NR==FNR { acct[$1]; next }
     $1 in acct { file="/tmp/" $1 ".txt"; print >>file; close(file) }' \
    account_list.txt <( zcat datafile.0[2-3]2015.gz )

Isso pressupõe bash ou algum outro shell que entende as substituições do processo. Também presume que a lista de contas contém o nome da conta na primeira coluna e que os arquivos de dados também contêm o nome da conta na primeira coluna (você não mostrou realmente como são esses arquivos, por isso não posso dizer se isso funcionaria ou não).

O primeiro bloco awk é executado apenas para o primeiro arquivo, account_list.txt , e criará uma matriz associativa, acct , com os nomes das contas para extrair como chaves.

O segundo bloco é executado somente sobre as linhas dos arquivos de dados extraídos, e se o primeiro campo corresponde a uma chave em acct , então essa linha é impressa em um arquivo apropriadamente nomeado.

    
por 25.05.2018 / 22:33