Usar uniq -f 1 da resultados inesperados

Usar uniq -f 1 da resultados inesperados

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 By bbb xpzson adyacentes entre sí? Si:

B ---> (empty)

y

bbb ---> xpz

un valor vacío y xpzambos 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é uniqse 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 1para 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 uniqse 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.txtsalida:

b
b
B
B

todos se tratarían igual y solo bse conservaría la primera línea que contiene, por lo tanto, tendrá un ben la salida.

Del mismo modo, de:

c
c
C

solo el primero cterminaría en la uniqsalida 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

información relacionada