Используя uniq-f 1 дает неожиданные результаты

После задавания вопроса на 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 оба уникальны, таким образом, обе строки должны быть распечатаны. Или я пропускаю что-то?

1
задан 9 June 2017 в 04:10

2 ответа

Ответ лежит в порядке сортировки и что 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.

2
ответ дан 7 December 2019 в 13:32

Вот таблица, которая может помочь вам пройти через процесс:

----------------+---------------+----------+----------------+
    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
0
ответ дан 7 December 2019 в 13:32

Другие вопросы по тегам:

Похожие вопросы: