Remove valores duplicados dentro de um campo

5

Como remover valores duplicados (ou mais) dentro de um campo selecionado em um arquivo, mantendo apenas uma cópia?

Exemplo

Arquivo de entrada:

A    1,2,3,45,1,8,2,3
B    5,6,6,6,6,6,2,3,7

Resultado esperado:

A    1,2,3,45,8
B    5,6,2,3,7
    
por dovah 05.08.2014 / 12:23

6 respostas

2

Outra solução perl :

perl -anle '                                                                    
    print "$F[0] ", join ",", grep {!$seen{$_}++} split ",",$F[1];              
    %seen=();                                                                   
' file
A 1,2,3,45,8
B 5,6,2,3,7
    
por 05.08.2014 / 12:35
5

Um sed um:

sed '
  s/[^[:blank:]]\{1,\}/,&,/g;:1
  s/\(\(,[^,[:blank:]]*\)\(,[^,[:blank:]]*\)*\),/,/;t1
  s/,\([^[:blank:]]*\),//g'

(processa todos os campos que contêm , caracteres e preserva o espaçamento)

    
por 05.08.2014 / 12:59
3

com perl :

perl -MList::MoreUtils=uniq -pe 's{\S*,\S*}{join ",", uniq split ",", $&}ge'

(processa todos os campos que contêm , caracteres e preserva o espaçamento)

    
por 05.08.2014 / 12:30
2

Eu acho que isso é como o de Stephane, embora seja um pouco diferente. De qualquer forma, me dei ao trabalho de escrevê-lo. Eu baseei isso nessa coisa que fiz antes aqui (onde eu também explico muito melhor) ...

sed ':t
s/\([^,]*\),\(.*\)/ /;tt
s/  */,/g;s/,/ /;s/,$//' <<\DATA
A 1,2,3,45,1,8,2,3,
B 5,6,6,6,6,6,2,3,7
DATA

OUTPUT

A 45,1,8,2,3
B 5,6,2,3,7
    
por 06.08.2014 / 05:31
2
awk '{n=split($2, a, ","); $2=a[1];
  for(i=2; i<=n; i++)
    {$2 = ($2 ~ "(^|,)" a[i] "($|,)") ? $2 : ($2 "," a[i])}}1' OFS='\t' file
    
por 06.08.2014 / 07:23
1

Para completar, uma solução em awk :

BEGIN {
    FS = "[ \t,]+";
    OFS = ",";
}

{
    delete seen;
    for(i = 2; i <= NF; i++) {
        if($i in seen) {
            $i = "";
        }
        seen[$i] = 1;
    }
    sub(",","\t");   #separate first field with a tab
    gsub(",,+",","); #squeeze empty fields
    sub(",$","");    #remove trailing comma, if any
    print;
}
    
por 05.08.2014 / 16:49

Tags