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 comm
kein numerischer Vergleich durchgeführt wird und die Einträge nur lexikografisch betrachtet werden. Wenn ja, welche Alternativen kann ich hierfür ausprobieren?
Antwort1
comm
sollte 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