Remove toda palavra duplicada da string usando o shell script

7

Eu tenho uma string como

"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"

Eu quero remover a palavra duplicada da string e a saída será como

"aaa,bbb,ccc"

Eu tentei Este código Source

$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs

Ele está funcionando bem com o mesmo valor, mas quando eu dou o valor da minha variável, ele também mostra todas as palavras duplicadas.

Como posso remover o valor duplicado?

UPDATE

Minha pergunta é adicionar todo o valor correspondente em uma única string se o usuário for o mesmo. Tenho dados como este - >

   user name    | colour
    AAA         | red
    AAA         | black
    BBB         | red
    BBB         | blue
    AAA         | blue
    AAA         | red
    CCC         | red
    CCC         | red
    AAA         | green
    AAA         | red
    AAA         | black
    BBB         | red
    BBB         | blue
    AAA         | blue
    AAA         | red
    CCC         | red
    CCC         | red
    AAA         | green

Na codificação eu busco todos os usuários distintos, então eu concateno a string de cores com sucesso. Para isso eu estou usando código -

while read the records 

    if [ "$c" == "" ]; then  #$c I defined global
        c="$colour1"
    else
        c="$c,$colour1" 
    fi

Quando imprimo esta variável $ c, obtenho a saída (para usuário AAA)

"red,black,blue,red,green,red,black,blue,red,green,"

Eu quero remover a cor duplicada. Então a saída desejada deve ser como

"red,black,blue,green"

Para esta saída desejada eu usei o código acima

 echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs

mas está exibindo a saída com valores duplicados .Como

"vermelho, preto, azul, vermelho, verde, vermelho, preto, azul, vermelho, verde" Obrigado

    
por Urvashi 23.03.2017 / 13:41

9 respostas

7

Mais um awk, apenas por diversão:

$ a="aaa bbb aaa bbb ccc aaa ddd bbb ccc"
$ echo "$a" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}'
aaa bbb ccc ddd 

A propósito, até a sua solução funciona bem com variáveis:

$ b="zebra ant spider spider ant zebra ant" 
$ echo "$b" | xargs -n1 | sort -u | xargs
ant spider zebra
    
por 23.03.2017 / 15:12
8
$ echo "zebra ant spider spider ant zebra ant"  | awk -v RS="[ \n]+" '!n[$0]++' 
zebra
ant
spider
    
por 23.03.2017 / 16:25
6

Com tr , sort e uniq

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort | uniq

ou

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort | uniq | xargs 

para obter uma linha

    
por 23.03.2017 / 13:55
2

Com gnu sed :

sed ':s;s/\(\<\S*\>\)\(.*\)\<\>//g;ts'

Você pode adicionar ;s/ */ /g para remover espaços dublicados.

Funciona assim: se uma palavra for uma segunda vez nesta linha, remova-a e comece novamente até que nenhuma publicação seja encontrada.

    
por 23.03.2017 / 13:52
2
perl -lane '$,=$";print grep { ! $h{$_}++ } @F'
    
por 23.03.2017 / 14:07
2

Solução awk obrigatória:

$ echo "ant zebra ant spider spider ant zebra ant" | 
   awk -vRS=" " -vORS=" " '!a[$1] {a[$1]++} END{ for (x in a) print x;  } ' ; echo
zebra ant spider 

(O echo final está lá para a nova linha)

    
por 23.03.2017 / 14:52
1

Python

Opção 1

#!/usr/bin/env python
# get_unique_words.py

import sys

l = []
for w in sys.argv[1].split(','):
  if w not in l:
    l += [ w ]
print ','.join(l)

Crie executáveis e, em seguida, chame do Bash:

$ ./get_unique_words.py "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
aaa,bbb,ccc

Ou você poderia implementá-lo como uma função Bash, mas a sintaxe é confusa.

get_unique_words(){
  python -c "
l = []
for w in '$1'.split(','):
  if w not in l:
    l += [ w ]
print ','.join(l)"
}

Opção 2

Esta opção pode tornar-se um one-liner, se necessário:

#!/usr/bin/env python
# get_unique_words.py

import sys

s_in = sys.argv[1]
l_in = s_in.split(',') # Turn string into a list.
set_out = set(l_in) # Turning a list into a set removes duplicates items.
s_out = ','.join(set_out) 
print s_out

No Bash:

get_unique_words(){
  python -c "print ','.join(set('$1'.split(',')))"
}
    
por 23.03.2017 / 21:34
0

cat filename | awk '{delete a; para (i = 1; i < = NF; i ++) a [$ i] ++; n = asorti (a, b); para (i = 1; i < = n; i ++) printf b [i] ""; print ""} '> newfile

    
por 02.12.2018 / 05:18
-2
a="aaa aaa aaa bbb bbb ccc bbb ccc"
for item in $a
do
   echo $item
done | sort -u | (while read i; do ans="$ans $i"; done ; echo $ans)
    
por 24.03.2017 / 01:18