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 fonte
$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Está funcionando bem com o mesmo valor, mas quando dou meu valor de variável, também está mostrando todas as palavras duplicadas.
Como posso remover um valor duplicado.
ATUALIZAR
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
Ao codificar, busco todos os usuários distintos e concatenarei a sequência de cores com êxito. Para isso, estou usando o código -
while read the records
if [ "$c" == "" ]; then #$c I defined global
c="$colour1"
else
c="$c,$colour1"
fi
Quando imprimo essa variável $ c, recebo a saída (para o usuário AAA)
"red,black,blue,red,green,red,black,blue,red,green,"
Quero remover cores duplicadas. A saída desejada deve ser como
"red,black,blue,green"
Para esta saída desejada, 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.
"vermelho, preto, azul, vermelho, verde, vermelho, preto, azul, vermelho, verde", obrigado
fonte
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
dáaaa bbb ccc
.. então você precisa mostrar o código exato que você cansado e saída que você tem .. com a corda na variável:s='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Respostas:
Mais um awk, apenas por diversão:
A propósito, até sua solução funciona bem com variáveis:
fonte
%s
vez de%s%s
. A razão é que eu estava fazendo um loop for nos resultados e dois espaços em branco causaram alguns desafios com as correspondências regex.Com
tr
,sort
euniq
ou
para obter uma linha
fonte
| xargs
para se juntar a saída para uma linha novamentesort -u
. Ou até umawk '!u[$0]++
.sort -u
. Eu tenho usadosort | uniq
todo esse tempo. As teclas desperdiçados ...fonte
Com o gnu
sed
:Você pode adicionar
;s/ */ /g
para remover espaços públicos.Funções como esta: se uma palavra for uma segunda vez nesta linha, remova-a e comece novamente até que nenhuma publicação seja encontrada.
fonte
\<
e\>
?fonte
Solução awk obrigatória:
(A final
echo
está lá para a nova linha)fonte
sort
solução também não mantém a ordem original.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
isso preserva o pedido.Pitão
Opção 1
Torne executável e ligue a partir do Bash:
Ou você pode implementá-lo como uma função Bash, mas a sintaxe é confusa.
opção 2
Esta opção pode se tornar uma linha, se necessário:
No Bash:
fonte
fonte
awk
implementação específica que está sendo usada (asorti()
não é umaawk
função padrão ).Usando os dados tabulares originais no arquivo chamado
file
:Isso gera
As três etapas do pipeline:
sed
comando remove a primeira linha, que é um cabeçalho que não queremos ler.O
sort
comando nos fornece linhas únicas. Os dados de amostra após asort
aparênciaawk
comando pega esses dados e produz uma cadeia de caracteres delimitada por vírgula para cada usuário na matrizcolor
(em que o nome de usuário é a chave da matriz). No final (noEND
bloco), todos os dados coletados são emitidos.fonte
fonte