Почему в выводе comm не отображаются общие записи?

Почему в выводе comm не отображаются общие записи?

У меня есть список идентификаторов (отсортированный) в двух файлах, и я запустил команду comm, чтобы сравнить их, но, похоже, она пропускает одну строку, общую для обоих файлов. Почему так?

Файл1:

1
2
3
4
5
6
7
8
9
11
12
13
15
16
17
18
19
20
21
22

Файл2:

16
18
21
23
705
707
709
711
712
826
827
839
846
847
848
872
873
874
875
891

Выходной сигнал:$> comm file1 file1

1
    16  //exists in both files
    18  //exists in both files
2
    21
    23
3
4
5
6
7
    705
    707
    709
    711
    712
8
    826
    827
    839
    846
    847
    848
    872
    873
    874
    875
    891
9
11
12
13
15
16 //it's here!
17 
18 //...and here!
19
20
21
22

Оба файла отсортированы. Однако, я предполагаю, что это commне делает числовое сравнение и только смотрит на записи лексикографически? Если так, какие альтернативы я могу попробовать для этого?

решение1

commдолжен сообщить вам, что один из файлов не отсортирован:

comm: file 1 is not in sorted order

Ожидается, что файлы будут отсортированы с использованием порядка сортировки текущей локали (определенного параметром LC_COLLATE); числовой порядок не принимается.

Чтобы сравнить файлы, вы можете предварительно отсортировать их (лексикографически, как вы указали):

comm <(sort file1) <(sort file2)

Если вы хотите, чтобы результат был отсортирован по числовому признаку, отсортируйте его еще раз:

comm <(sort file1) <(sort file2) | sort -n

Это производит

1
2
3
4
5
6
7
8
9
11
12
13
15
        16
17
        18
19
20
        21
22
    23
    705
    707
    709
    711
    712
    826
    827
    839
    846
    847
    848
    872
    873
    874
    875
    891

Связанный контент