Warum werden in der Ausgabe von „comm“ keine gemeinsamen Datensätze angezeigt?

Warum werden in der Ausgabe von „comm“ keine gemeinsamen Datensätze angezeigt?

Ich habe eine Liste von IDs (sortiert) in zwei Dateien und habe den Befehl „comm“ ausgeführt, um sie zu vergleichen. Dabei scheint jedoch eine Zeile zu fehlen, die in beiden Dateien vorkommt. Warum ist das so?

Datei1:

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

Datei2:

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

Kommunikationsausgang:$> 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

Die Dateien sind beide sortiert. Ich vermute jedoch, dass commkein numerischer Vergleich durchgeführt wird und die Einträge nur lexikografisch betrachtet werden. Wenn ja, welche Alternativen kann ich hierfür ausprobieren?

Antwort1

commsollte Ihnen mitteilen, dass eine der Dateien nicht sortiert ist:

comm: file 1 is not in sorted order

Es wird erwartet, dass die Dateien in der Sortierreihenfolge des aktuellen Gebietsschemas (wie durch festgelegt LC_COLLATE) sortiert werden. Eine numerische Reihenfolge wird nicht akzeptiert.

Um die Dateien zu vergleichen, können Sie sie vorsortieren (lexikografisch, wie Sie anmerken):

comm <(sort file1) <(sort file2)

Wenn Sie möchten, dass das Ergebnis numerisch sortiert wird, sortieren Sie es erneut:

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

Dadurch entsteht

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

verwandte Informationen