Por que a saída do comm não mostra registros comuns?

1

Eu tenho uma lista de IDs (classificados) em dois arquivos e executei o comando comm para compará-los, mas parece que falta uma linha comum a ambos os arquivos. Por que isso?

Arquivo1:

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

Arquivo2:

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

Saída de comunicação: $> 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

Os arquivos são classificados. No entanto, meu palpite é que comm não faz comparação numérica e só olha para as entradas lexicograficamente? Em caso afirmativo, quais são algumas alternativas que posso tentar para isso?

    
por PhD 13.04.2017 / 23:07

1 resposta

4

comm deve informar que um dos arquivos não está classificado:

comm: file 1 is not in sorted order

Espera que os arquivos sejam classificados usando a ordem de agrupamento do local atual (conforme determinado por LC_COLLATE ); não aceita pedidos numéricos.

Para comparar os arquivos, você pode classificá-los previamente (lexicograficamente como você aponta):

comm <(sort file1) <(sort file2)

Se você deseja que o resultado seja classificado numericamente, classifique-o novamente:

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

Isso produz

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
    
por 13.04.2017 / 23:11