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 aos dois arquivos. Por que é que?
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 estão classificados. No entanto, meu palpite é que isso comm
não faz comparação numérica e apenas analisa as entradas lexicograficamente? Em caso afirmativo, quais são algumas alternativas que posso tentar para isso?
Responder1
comm
deve informar que um dos arquivos não está classificado:
comm: file 1 is not in sorted order
Ele espera que os arquivos sejam classificados usando a ordem de agrupamento da localidade atual (conforme determinado por LC_COLLATE
); não aceitará ordem numérica.
Para comparar os arquivos, você pode pré-classificá-los (lexicograficamente, como você aponta):
comm <(sort file1) <(sort file2)
Se você quiser 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