Tengo un archivo con una columna con nombres que se repiten varias veces cada uno. Quiero condensar cada repetición en una, mientras mantengo cualquier otra repetición del mismo nombre que no sea adyacente a otras repeticiones del mismo nombre.
Por ejemplo, quiero girar el lado izquierdo hacia el lado derecho:
Golgb1 Golgb1
Golgb1 Akna
Golgb1 Spata20
Golgb1 Golgb1
Golgb1 Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna
Esto es lo que he estado usando: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
Sin embargo, este método solo mantiene a un representante desde la izquierda (es decir, Golb1 y Akna no se repiten).
¿Hay alguna manera de mantener nombres únicos para cada bloque, mientras se mantienen nombres que se repiten en múltiples bloques no adyacentes?
sort | uniq
sort -u
(:Awk
solución:La salida:
fuente
Pruebe esto: guarde la línea anterior y compare con la línea actual
También lo has etiquetado
uniq
, ¿lo intentaste?fuente
Con sed se puede hacer de la siguiente manera:
Aquí tenemos en el espacio del patrón en cualquier momento 2 líneas. Cuando la comparación entre ellos falla, imprimimos el primero y lo cortamos desde el frente y regresamos y agregamos la siguiente línea al espacio del patrón. Enjuague ... repita
Al utilizar Perl en el modo slurp, tratamos todo el archivo como una cadena larga en la que se aplica la expresión regular que hace la comparación por usted.
fuente
Pregunta sobre la solución sed de Rakesh Sharma.
¿Qué pasa si tiene un archivo de entrada como:
Y desea que un archivo de salida sea:
Tenga en cuenta lo que falta:
Sé que el comando que quiero es similar a tu solución:
No se puede modificar de la manera correcta para imprimir ambas columnas y solo se puede ordenar de esta manera especial con los valores de la columna 2. ¿Algun consejo?
fuente
sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D'
eliminará los elementos repetidos posteriores. Nota: esto requiereGNU sed
. Para elPOSIX
comportamiento, necesita una ligera alteración.