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 B
e bbb xpz
são adjacentes uma à outra? Se:
B ---> (empty)
e
bbb ---> xpz
um valor vazio e xpz
sã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 é uniq
usado 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 1
para 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, uniq
utiliza 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.txt
saída:
b
b
B
B
todos seriam tratados como iguais e apenas a primeira linha contendo b
seria preservada, portanto, você tem um b
na saída.
Da mesma forma, de:
c
c
C
apenas o primeiro c
acabaria na uniq
saí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