Aquí hay comandos en un archivo aleatorio de pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
Las páginas del manual no tienen claro qué -u
está haciendo la bandera. ¿Algún consejo?
Respuestas:
Version corta:
uniq
, sin-u
, hace que cada línea de la salida sea única.uniq -u
solo imprime cada línea única desde la entrada .Versión ligeramente más larga:
uniq
es para tratar con archivos que tienen líneas duplicadas, y solo cuando esas líneas aparecen sucesivamente en la entrada. Entonces, para sus propósitos, una línea única es aquella que no se duplica inmediatamente.(
uniq
tiene una memoria a corto plazo muy limitada; nunca recordará si una línea apareció antes en la entrada, a menos que fuera la línea inmediatamente anterior; esta es la razón por la cualuniq
se combina muy a menudosort
).Cuando encuentra una serie de líneas duplicadas
uniq
, sin el-u
argumento, imprime una copia de esa línea. (Hace que cada línea de la salida sea única ).Con el
-u
argumento, imprime cero copias de esa línea: las ejecuciones de duplicados simplemente se omiten de la salida.fuente
sort -u
lugar desort | uniq
.uniq
hace normalización y colación, sí. Pero incluso entonces es solo una consideración local: usted sabe dónde aparecerá la línea en la salida ordenada, y solo tiene que seleccionar cuál de varias líneas adyacentes desea mantener. Si la entrada no está ordenada, entonces la decisión afecta a toda la operación de unificación, por ejemplo, si va a mantener el último duplicado, no puede generar nada hasta que haya leído la última línea de la entrada ...uniq
con-u
omite cualquier línea que tenga duplicados. Así:Por lo general,
uniq
imprime líneas como máximo una vez (suponiendo una entrada ordenada). Esta opción realmente imprime líneas que son verdaderamente únicas (que no han vuelto a aparecer).fuente
uniq
podría llamarsedistinct
, ya que imprime todas las líneas distintas, mientras queuniq -u
imprime todas las líneas únicas.uniq
en alguna configuración regional.la especificación POSIX de uniq lo describió claramente:
-u
opción haceruniq
no imprimir líneas repetidas.La mayoría de las
uniq
implementaciones usaban comparación de bytes, mientras que GNUuniq
usaba el orden de clasificación para filtrar líneas duplicadas. Por lo tanto, puede producir un resultado incorrecto en algunas configuracionesen_US.UTF-8
regionales , por ejemplo, en la configuración regional:y
-u
no te dio líneas:Por lo tanto, debe establecer la configuración regional
C
para obtener la comparación de bytes:fuente
uniq
(aunque aparentemente la intención de POSIX era que debería hacer una comparación de bytes en lugar de una comparación strcoll () como ensort -u
) como aquellas configuraciones regionales que erróneamente tienen ① ordenando lo mismo que ②. Al menos GNUuniq
es consistente consort -u
.uniq
requerido para hacer memcmp / strcmp en lugar de strcoll, eso no es muy evidente para mí, pero eso fue para Geoff . Sobre las configuraciones regionales de GNU que tienen ① ordenando lo mismo que ②, eso es claramente un error ya que no hay razón por la que deberían ordenar lo mismo. POSIX lo permite, pero se avecinan algunos cambios .normal:
uniq: no hay dos líneas repetidas posteriores
ordenado
sort -u: no hay dos líneas repetidas
sort / uniq: todos distintos
cuenta sucesos distintos
solo líneas que no se repiten (no se ordenan primero)
solo líneas que no se repiten (después de ordenar)
uniq -d: solo imprime líneas duplicadas, una para cada grupo
.. contado
fuente