awk, valores duplicados [duplicados]

1

Estou tentando escrever um script para retornar valores duplicados com base em um conjunto de parâmetros se eles forem repetidos duas vezes. Por exemplo, no meu arquivo de texto eu tenho esta configuração:

SPPARK|6543|M1122|6543|Hendrick|Brian|1977/11/09||
SPPARK|1245|M3344|6543|Hendrick|Brian|1977/11/09||

Agora, se o sobrenome, o nome e a repetição de DOB quiserem, retorne ambas as linhas e continue, sei o awk pode fazer isso, mas não parece funcionar direito .

awk '!seen[$4,$5]++ > 1' DemoDATA.txt
    
por Josh Adams 12.06.2018 / 18:38

2 respostas

2
awk '!seen[$4, $5]++ > 1' DemoDATA.txt

está quase correto, além do fato de que os campos no arquivo são delimitados por | e que os campos que você deve examinar para o último nome e data de nascimento são os campos 5, 6 e 7. Você também não tem que comparar com 1 (eu posso ver porque você faz isso, mas a comparação nunca seria verdadeira).

Corrigido:

awk -F '|' '!seen[$5, $6, $7]++' DemoDATA.txt

Isso, no entanto, só produzirá as duplicatas, não a linha original. Para fazer isso, você teria que salvar o arquivo inteiro na memória enquanto o analisa ...

... que é o que as respostas para " Como imprimo todas as linhas de um arquivo com valores duplicados em uma determinada coluna " estão fazendo (ou não, se forem inteligentes, quais eles são).

    
por 12.06.2018 / 19:37
0

Como Kusalananda sugeriu, salvando todo o arquivo na memória:

awk -F'|' '
    {
        key = $5 FS $6 FS $7
        count[key]++
        data[key] = data[key] (count[key] == 1 ? "" : ORS) $0
    }
    END { for (key in count) if (count[key] > 1) print data[key] }
' DemoDATA.txt

ou

perl -F'\|' -ane '
        $key = join "|", @F[4..6];
        push @{$data{$key}}, $_;
    } END {
        print @{$data{$_}} for grep {@{$data{$_}} > 1} keys %data;
' DemoDATA.txt
    
por 12.06.2018 / 20:05