После задавания вопроса на ubuntuforums.org и не получении удовлетворяющего ответа, я решил задать вопрос снова здесь на, Спрашивает Ubuntu. Мне нужен ответ, чтобы быть очень подробным. А именно, я должен знать, какие строки сравнены каждый раз, когда строка печатается с помощью uniq для следующего двум примерам:
file1.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
и file2.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
Я смущен вторым примером. Я не понимаю, каким образом прописной B не заканчивается в окончательном результате. Не был должен строка с верхним регистром B быть распечатанной, учитывая, что строки B
и bbb xpz
действительно ли оба смежны друг с другом? Если:
B ---> (empty)
и
bbb ---> xpz
пустое значение и xpz
оба уникальны, таким образом, обе строки должны быть распечатаны. Или я пропускаю что-то?
Ответ лежит в порядке сортировки и что uniq
использует для значения поля, когда существует меньше заданного номера поля (N
) при использовании -f N
.
Как видно, у вас есть наборы символов ASCII, поэтому порядок сортировки очень предсказуем:
% sort file.txt
A
aaa upc
aaa ztp
b
b
B
B
bbb xpz
c
c
C
Теперь давайте воспользуемся uniq -f 1
, чтобы получить уникальные строки, пропуская (разделенные пробелами) первое поле каждой строки. при проверке:
% sort file.txt | uniq -f 1
A
aaa upc
aaa ztp
b
bbb xpz
c
Теперь важно отметить, что uniq
использует нулевую строку для строк, у которых меньше упомянутых полей, 1 в этом случае; таким образом, все строки, которые имеют только одно поле, будут рассматриваться как имеющие нулевые строки для других полей при сравнении с другими строками, имеющими> = 2 поля.
Итак, из вывода sort file2.txt
:
b
b
B
B
все будут рассматриваться как одинаковые, и будет сохранена только первая строка, содержащая b
, следовательно, у вас есть b
на выходе.
Аналогично, из:
c
c
C
только первый c
окажется в выводе uniq
.
Вот таблица, которая может помочь вам пройти через процесс:
----------------+---------------+----------+----------------+
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