Dados de entrada:
id,location_id,name,title,[email protected],department
1,1,Susan houston,Director of Services,[email protected],
2,1,Christina Gonzalez,Director,[email protected],
3,2,Brenda brown,"Director, Second Career Services",[email protected],
4,3,Howard Lader,"Manager, Senior Counseling",[email protected],
8,6,Bart charlow,Executive Director,[email protected],
9,7,Bart Charlow,Executive Director,[email protected],
Preciso adicionar um caractere para duplicar e-mails após a parte do e-mail, ou seja, [email protected] se tornaria [email protected] (o dígito após a parte do e-mail precisa ser retirado da segunda coluna). Como posso fazer isso no Bash para todas as entradas?
Supondo que quando você diz:
você está se referindo apenas à segunda ocorrência desse endereço de e-mail, não a todos eles, então use qualquer awk:
O cerne disso é o
sub()
comando que substitui o@
pelo valor do segundo campo ($2
) e então ele mesmo (&
é substituído pelo que foi correspondido na primeira parte).Para obter mais informações sobre o processamento de CSV com awk, consulte qual é a maneira mais robusta de analisar eficientemente o CSV usando o awk .
Usando Miller (
mlr
) para ler os dados como CSV, conte o número de vezes que cada valor do[email protected]
campo ocorre (adiciona um campo temporário chamadocount
), modifique o[email protected]
campo se necessário (secount
for maior que 1) e, em seguida, exclua ocount
campo temporário.A modificação do
[email protected]
campo é acionada pelo$count > 1
teste e é realizada dividindo o campo no@
caractere e depois juntando as partes novamente com o valor dolocation_id
campo inserido.Em vez de uma operação de divisão+junção, você pode fazer isso com uma
sub()
chamada, semelhante ao que Ed Morton mostra em seuawk
código :O resultado:
Usando "apenas
bash
" (sem utilitários externos):Isso faz uma série de suposições sobre a entrada que o código compatível com CSV no início desta resposta (usando Miller) manipularia sem problemas:
[email protected]
campo que seja[email protected]
.@
caractere ocorre apenas uma vez em cada linha de entrada e está no[email protected]
campo.Saída: