Usando 'diff' compara nomes de usuários de arquivo1 a arquivo2 contendo e-mails

0

Estou tentando identificar contas ativas em contas mortas e queria saber se diff , juntamente com grep ou sed ou regex , pode ser usado, em vez de escrever um programa longo.

File1 (usernames)                  File2 (emails)
janedoe                            [email protected]
johndoe                            [email protected]

Cada arquivo contém cerca de 1000 vezes e eu preciso fazer isso com frequência, uma vez por semana ou mais.

Tarefa
-Verifique se os nomes de usuários do arquivo1 existem no arquivo2. Nos dados de amostra acima, eles existem.
-Se eles existem, comente-os no arquivo1.

No passado, usei o diff para comparar arquivos e usei o regex para ignorar linhas. Mas, infelizmente, não posso envolver meu cérebro para ignorar ou considerar apenas uma parte da string dos e-mails. (Desde que @ e qualquer coisa depois disso não é comparável)

Qualquer ajuda seria apreciada. :)

    
por Boring Loop 03.03.2016 / 16:35

1 resposta

1

Você pode conseguir isso usando qualquer linguagem de script que conheça hashes / dicionários / matrizes associativas / qualquer que seja o recurso.

Uma abordagem muito muito simples seria assim:

$> cat File1
johndoe
janedoe
nosuchkid
$> cat File2
[email protected]
[email protected]
$> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1
johndoe
janedoe
# nosuchkid

Provavelmente, você pode ver que este não modifica nada nos arquivos de entrada apenas grava stdout.

EDITAR: Redirecionando a saída para um arquivo e renomeando o que apareceria como alterações no arquivo original chamado File1 aqui (fazer um backup do arquivo original é sempre uma boa idéia):

$> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1 > File1.tmp ; cp File1 File1.old ; mv File1.tmp File1
$> cat File1
johndoe
janedoe
# nosuchkid

EDIT2: Vamos ser um pouco menos literais:

$> export PERSONFILE=File1 EMAILFILE=File2; awk -F'@' 'FILENAME==ENVIRON["EMAILFILE"] { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' "$EMAILFILE" "$PERSONFILE" > "$PERSONFILE.tmp" ; cp "$PERSONFILE" "$PERSONFILE.old" ; mv "$PERSONFILE.tmp" "$PERSONFILE"
    
por 03.03.2016 / 17:04