Después de hacer una pregunta en ubuntuforums.org y no obtener una respuesta satisfactoria, decidí hacer la pregunta nuevamente aquí en Ask Ubuntu. Necesito que la respuesta sea muy detallada. Específicamente necesito sabercuallas líneas se comparancada vezSe imprime una línea usando uniq para los dos ejemplos siguientes:
archivo1.txt:
$ cat -A file1.txt
aaa^Iupc$
b$
c$
aaa^Iztp$
b$
c$
C$
A$
B$
B$
b$
$ sort file1.txt | uniq -f 1
A
aaa upc
aaa ztp
b
y archivo2.txt:
$ cat -A file2.txt
aaa^Iupc$
b$
c$
aaa^Iztp$
b$
c$
C$
A$
B$
B$
bbb^Ixpz$
$ sort file2.txt | uniq -f 1
A
aaa upc
aaa ztp
b
bbb xpz
c
Estoy confundido acerca del segundo ejemplo. No entiendo cómo es que la B mayúscula no termina en el resultado final. ¿No debería imprimirse la línea con B mayúscula dado que las líneas B
y bbb xpz
son adyacentes entre sí? Si:
B ---> (empty)
y
bbb ---> xpz
un valor vacío y xpz
ambos son únicos, por lo que se deben imprimir ambas líneas. ¿O me estoy perdiendo algo?
Respuesta1
La respuesta está en el orden de clasificación y en qué uniq
se utiliza para un valor de campo cuando existe menos que el número de campo dado ( N
) durante el uso -f N
.
Como se ve, tiene conjuntos de caracteres ASCII, por lo que el orden de clasificación es mucho más predecible:
% sort file.txt
A
aaa upc
aaa ztp
b
b
B
B
bbb xpz
c
c
C
Ahora, usemos uniq -f 1
para obtener líneas únicas omitiendo el primer campo (separado por espacios en blanco) de cada línea mientras verificamos:
% sort file.txt | uniq -f 1
A
aaa upc
aaa ztp
b
bbb xpz
c
Ahora, lo importante a tener en cuenta es que uniq
se utiliza una cadena nula para las líneas que tienen menos de los campos mencionados, 1 en este caso; por lo tanto, todas las líneas que tienen un solo campo se tratarían como si tuvieran cadenas nulas para otros campos en comparación con otras líneas que tengan >= 2 campos.
Entonces, de la sort file2.txt
salida:
b
b
B
B
todos se tratarían igual y solo b
se conservaría la primera línea que contiene, por lo tanto, tendrá un b
en la salida.
Del mismo modo, de:
c
c
C
solo el primero c
terminaría en la uniq
salida de.
Respuesta2
A continuación se muestra una tabla que puede ayudarle a seguir el proceso:
----------------+---------------+----------+----------------+
sort | Remove | Adjacent | |
(C locale) | field #1 | match? | Output |
----------------+---------------+----------+----------------+
A | | N* |A |
B | | Y | |
B | | Y | |
C | | Y | |
aaa upc | upc | N |aaa upc |
aaa ztp | ztp | N |aaa ztp |
b | | N |b |
b | | Y | |
bbb xpz | xpz | N |bbb xpz |
c | | N |c |
c | | Y | |
----------------+---------------+----------+----------------+
* the first line has no adjacent above, so is always output