Tengo una cuerda como
"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Quiero eliminar la palabra duplicada de la cadena y luego la salida será como
"aaa,bbb,ccc"
Intenté este código Fuente
$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Está funcionando bien con el mismo valor, pero cuando doy mi valor variable, también muestra todas las palabras duplicadas.
¿Cómo puedo eliminar el valor duplicado?
ACTUALIZAR
Mi pregunta es agregar todo el valor correspondiente en una sola cadena si el usuario es el mismo. Tengo datos 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
En la codificación, busco a todos los usuarios distintos y luego concateno la cadena de color con éxito. Para eso estoy usando código:
while read the records
if [ "$c" == "" ]; then #$c I defined global
c="$colour1"
else
c="$c,$colour1"
fi
Cuando imprimo esta variable $ c obtengo el resultado (para el usuario AAA)
"red,black,blue,red,green,red,black,blue,red,green,"
Quiero eliminar el color duplicado. Entonces la salida deseada debería ser como
"red,black,blue,green"
Para esta salida deseada, utilicé el código anterior
echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
pero muestra la salida con valores duplicados.
"rojo, negro, azul, rojo, verde, rojo, negro, azul, rojo, verde" Gracias
fuente
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
daaaa bbb ccc
... por lo que necesita mostrar el código exacto que cansó y la salida que obtuvo ... con la cadena en variable:s='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Respuestas:
Un awk más, solo por diversión:
Por cierto, incluso su solución funciona bien con variables:
fuente
%s
lugar de%s%s
. La razón es que estaba haciendo un ciclo for a través de los resultados y dos espacios en blanco causaron algunos desafíos con las coincidencias de expresiones regulares.Con
tr
,sort
yuniq
o
para obtener una línea
fuente
| xargs
para unir la salida a una línea nuevamentesort -u
. O incluso aawk '!u[$0]++
.sort -u
. He estado usandosort | uniq
todo este tiempo. Las pulsaciones de teclado desperdiciadas ...fuente
Con gnu
sed
:Puede agregar
;s/ */ /g
para eliminar espacios duplicados.Funciones como esta: si una palabra es la segunda vez en esta línea, elimínela y comience de nuevo hasta que ya no se encuentre la duplicación.
fuente
\<
y\>
?fuente
Solución awk obligatoria:
(La final
echo
está ahí para la nueva línea)fuente
sort
embargo, la solución tampoco mantiene el orden original.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
esto preserva el pedido.Pitón
Opción 1
Haga ejecutable, luego llame desde Bash:
O podría implementarlo como una función Bash, pero la sintaxis es desordenada.
opcion 2
Esta opción puede convertirse en una línea si es necesario:
En Bash:
fuente
fuente
awk
implementación particular que se está utilizando (asorti()
no es unaawk
función estándar ).Usando los datos tabulares originales en el archivo llamado
file
:Esto genera
Los tres pasos de la tubería:
sed
comando elimina la primera línea, que es un encabezado que no queremos leer.El
sort
comando nos da líneas únicas. Los datos de muestra después delsort
aspectoawk
comando toma estos datos y produce una cadena delimitada por comas para cada usuario en la matrizcolor
(donde el nombre de usuario es la clave de la matriz). Al final (en elEND
bloque), se envían todos los datos recopilados.fuente
fuente