Usar uniq -f 1 fornece resultados inesperados

Usar uniq -f 1 fornece resultados inesperados

Depois de fazer uma pergunta no ubuntuforums.org e não obter uma resposta satisfatória, decidi fazer a pergunta novamente aqui no Ask Ubuntu. Preciso que a resposta seja bem detalhada. Especificamente, preciso saberquallinhas são comparadastoda vezuma linha é impressa usando uniq para os dois exemplos a seguir:

arquivo1.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

e arquivo2.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

Estou confuso sobre o segundo exemplo. Não entendo como é que B maiúsculo não acaba na saída final. A linha com B maiúsculo não deveria ser impressa, visto que as linhas Be bbb xpzsão adjacentes uma à outra? Se:

B ---> (empty)

e

bbb ---> xpz

um valor vazio e xpzsão únicos, portanto ambas as linhas devem ser impressas. Ou eu estou esquecendo de alguma coisa?

Responder1

A resposta está na ordem de classificação e no que é uniqusado para um valor de campo quando existe menos do que o número do campo fornecido ( N) durante o uso -f N.

Como visto, você tem conjuntos de caracteres ASCII, então a ordem de classificação é muito previsível:

% sort file.txt            
A
aaa upc
aaa ztp
b
b
B
B
bbb xpz
c
c
C

Agora, vamos usar uniq -f 1para obter linhas exclusivas ignorando o primeiro campo (separado por espaços em branco) de cada linha durante a verificação:

% sort file.txt | uniq -f 1
A
aaa upc
aaa ztp
b
bbb xpz
c

Agora, o importante é observar que, uniqutiliza string nula para linhas que possuem menos que os campos mencionados, 1 neste caso; portanto, todas as linhas que possuem apenas um campo seriam tratadas como tendo strings nulas para outros campos durante a comparação com outras linhas que possuem >=2 campos.

Então, a partir da sort file2.txtsaída:

b
b
B
B

todos seriam tratados como iguais e apenas a primeira linha contendo bseria preservada, portanto, você tem um bna saída.

Da mesma forma, de:

c
c
C

apenas o primeiro cacabaria na uniqsaída do '.

Responder2

Aqui está uma tabela que pode ajudá-lo a trabalhar no processo:

----------------+---------------+----------+----------------+
    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

informação relacionada