AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 793110
Accepted
NetRanger
NetRanger
Asked: 2025-03-29 20:48:32 +0800 CST2025-03-29 20:48:32 +0800 CST 2025-03-29 20:48:32 +0800 CST

Adicione um caractere para duplicar e-mails usando apenas o bash

  • 772

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?

bash
  • 2 2 respostas
  • 81 Views

2 respostas

  • Voted
  1. Best Answer
    Ed Morton
    2025-03-29T21:19:39+08:002025-03-29T21:19:39+08:00

    Supondo que quando você diz:

    [email protected] se tornaria [email protected]

    você está se referindo apenas à segunda ocorrência desse endereço de e-mail, não a todos eles, então use qualquer awk:

    $ awk 'BEGIN{FS=OFS=","} {f=NF-1} NR>1 && seen[$f]++{sub(/@/,$2"&",$f)} 1' file
    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],
    

    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 .

    • 3
  2. Kusalananda
    2025-03-30T00:32:27+08:002025-03-30T00:32:27+08:00

    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 chamado count), modifique o [email protected]campo se necessário (se countfor maior que 1) e, em seguida, exclua o countcampo temporário.

    mlr --from input.csv --csv \
        count-similar -g '[email protected]' then \
        put '$count > 1 {
            a = splita($["[email protected]"], "@");
            $["[email protected]"] = a[1] . $location_id . "@" . a[2];
        }' then \
        cut -x -f count
    

    A modificação do [email protected]campo é acionada pelo $count > 1teste e é realizada dividindo o campo no @caractere e depois juntando as partes novamente com o valor do location_idcampo 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 seu awkcódigo :

    mlr --from input.csv --csv \
        count-similar -g '[email protected]' then \
        put '$count > 1 {
            $["[email protected]"] = sub($["[email protected]"], "@", $location_id . "@");
        }' then \
        cut -x -f count
    

    O resultado:

    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],
    

    Usando "apenas bash" (sem utilitários externos):

    declare -A seen
    while IFS= read -r line; do
            addr=${line%,*}
            addr=${addr##*,}
    
            if [ "${seen[$addr]}" = 1 ]; then
                    loc=${line#*,}
                    loc=${loc%%,*}
    
                    if [[ $line =~ (.*)@(.*) ]]; then
                            line=${BASH_REMATCH[1]}$loc@${BASH_REMATCH[2]}
                    fi
            fi
            seen[$addr]=1
    
            printf '%s\n' "$line"
    done <input.csv
    

    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:

    1. Os campos são fixos e não se movem entre as execuções.
    2. Os campos 1º, 2º, penúltimo e último nunca contêm vírgulas incorporadas.
    3. Não há valor no [email protected]campo que seja [email protected].
    4. Nenhum campo em todo o arquivo contém uma nova linha incorporada.
    5. O @caractere ocorre apenas uma vez em cada linha de entrada e está no [email protected]campo.
    6. O segundo campo nunca é citado.

    Saída:

    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],
    
    • 3

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve