2012-05-14 3 views
5

ich habe zwei Dateien, aa und bb:join Weglassen Zeilen ausgegeben, wenn die Eingabe numerisch sortiert

$ cat aa 
84 xxx 
85 xxx 
10101 sdf 
10301 23 

$ cat bb 
82 asd 
83 asf 
84 asdfasdf 
10101 22232 
10301 llll 

i der Befehl kommen, um sie zu verbinden:

$ join aa bb 
84 xxx asdfasdf 

aber was erwartet ist 84, 10101 und 10301 schlossen sich an. Warum wurde nur 84 hinzugefügt?

+0

@qiuxafei hat das Tagging der Frage bearbeitet - Join ist kein Teil von bash, sondern ein Standard-UNIX-Tool, auf das von jeder Shell aus zugegriffen werden kann. –

Antwort

8

Verwenden Sie eine lexikographische Sortierung anstelle einer numerischen Sortierung.

dieser des Prozesses als Teil zu tun:

10101 sdf 22232 
10301 23 llll 
84 xxx asdfasdf 
+2

Fügt die Unterstützung numerischer Reihenfolge hinzu? – qiuxiafei

+1

@qiuxiafei nein, Join unterstützt numerische Reihenfolge nicht. –

6

Sie die Tatsache aufgenommen hat, dass eine Fehlermeldung ausgegeben:

$ join <(sort aa) <(sort bb) 

Das die Ausgabe gibt

$ join aa bb 
join: file 2 is not in sorted order 
84 xxx asdfasdf 
join: file 1 is not in sorted order 

Sie können eine normale lexikographische Sortierung verwenden:

join <(sort aa) <(sort bb) | sort -k1,1n 
+2

nicht alle Implementierungen geben diesen Fehler - einige nur im Hintergrund fehlschlagen. –

3

Wenn Sie das Sortieren vermeiden wollen, dann können Sie Pad mit awk Null:

join \ 
<(awk '{printf("%05d %s\n", $1, $2)}' aa) \ 
<(awk '{printf("%05d %s\n", $1, $2)}' bb) \ 
| awk '{print int($1),$2,$3}' 

Erzeugt diese Ausgabe, die die ursprüngliche Sortierreihenfolge bewahrt:

84 xxx asdfasdf 
10101 sdf 22232 
10301 23 llll 

Sie möchten Art zu vermeiden, weil Unix sort ist O (n log n).

Verwandte Themen