Usando awk
, primeiro leia os nomes de usuário dos usuários cuja conta está bloqueada no segundo arquivo e, em seguida, extraia os endereços de email deles do primeiro arquivo (então espere que eles não precisem fazer login para ler seus emails ):
awk -F ';' 'NR == FNR && $NF == 0 { names[$1] }
NR != FNR && $1 in names { print $NF }' B.csv A.csv
Isso pressupõe que cada nome de usuário tenha uma quantidade igual de espaço em branco ao redor deles em ambos os arquivos. Se não for assim, você pode usar -F ' *; *'
para incluir quaisquer caracteres de espaço no delimitador que awk
esteja usando. Ele também assume que não há caracteres ;
incorporados nos dados.
NR
é o número de registro (linha) do registro atual como um todo e FNR
é o mesmo número, mas dentro do arquivo atual. Se NR == FNR
, então estamos lendo o primeiro arquivo fornecido na linha de comando ( B.csv
). NF
é o número de campos (colunas) no registro atual e $NF
são os dados no último campo (e $1
são os dados no primeiro campo).
O código acima usa um array / hash associativo, names
, digitado nos nomes de usuários bloqueados, lidos a partir do primeiro arquivo ( B.csv
). O $1 in names
será verdadeiro se $1
for uma chave nessa matriz.
Colocando isso em um loop:
awk -F ';' 'NR == FNR && $NF == 0 { names[$1] }
NR != FNR && $1 in names { print $NF }' B.csv A.csv |
while read addr; do
printf 'Would send an email to "%s"\n' "$addr"
#mail -s 'Account locked' "$addr" <template-email.txt
done
Ou algo nesse sentido. Ler os endereços de e-mail dessa forma no loop excluiria qualquer espaço em branco ao redor deles. O loop acima não envia e-mails, mas imprime os endereços que precisam ser enviados. Remova o #
antes de mail
(e escreva algum e-mail de formulário em template-email.txt
) para realmente enviar um e-mail (mas você pode querer fazê-lo de maneira diferente).
Usando csvkit
:
csvjoin -d ';' -c 1 A.csv B.csv |
csvgrep -c 5 -m False |
csvcut -S -c 3 | sed 1d
O CSVkit fornece ferramentas de análise de CSV para trabalhar com arquivos CSV. Isso seria necessário se os dados CSV não forem "simples", ou seja, se usar regras CSV para citar os caracteres ;
incorporados, etc. O canal acima será
- Junte os dois arquivos nos nomes de usuários (os espaços em branco são significativos).
- Extraia os dados dos usuários que estão bloqueados (o
0
será alterado paraFalse
neste ponto do pipeline). - Extraia os endereços de e-mail.
- Remova o cabeçalho CSV (usando o último comando
sed
).