PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Korrekte Verwendung des Kommandos join?



ContainerDriver
06-02-2009, 22:06
Hallo,

hab den Thread schon mal vor ein paar Tagen in linuxforen.de aufgemacht (http://www.linuxforen.de/forums/showthread.php?t=259129), weil das Thema hier eigentlich nicht so recht reinpasst. Allerdings habe ich dort keine Antwort erhalten, bin mir aber ziemlich sicher, dass mir hier irgendjemand helfen kann.

Und zwar habe ich ein Problem mit der Verwendung von join. Ich will die Datei /etc/group mit der Ausgabe von id -g joinen um den Namen meiner Benutzergruppe zu erhalten (ich weiß, dass ich den auch leichter bekommen würde). Da in der Manpage von join steht, dass die beiden zu verbindenden Dateien nach dem Join-Kriterium sortiert sein müssen, lege ich hierzu eine sortierte Kopie von /etc/group an.


$ sort -t : -n -k 3 /etc/group > group.srt


Dann versuche ich zu joinen:


$ id -g
1000
$ id -g | join -t : -1 1 -2 3 -o 2.1 - group.srt
$
$ echo `id -g`:test | join -t : -1 1 -2 3 -o 2.1 - group.srt
$
, leider erscheint keine Ausgabe.

Wo liegt hier das Problem, bzw. was habe ich bei der Bedienung von join falsch gemacht?

Wenn ich das join-Kommando auf einem anderen System ausführe, erhalte ich folgende Fehlermeldung:


join: Datei 2 ist nicht sortiert


Allerdings ist die Datei 2 ja eigentlich nach dem join-Kriterium (Spalte 3) sortiert (mit Hilfe des sort-Aufrufs von weiter oben)? :confused:

Hier mal meine group.srt:


root::0:root
bin::1:root,bin,daemon
daemon::2:root,bin,daemon
sys::3:root,bin
adm::4:root,daemon
tty::5:
disk::6:root
lp::7:daemon
mem::8:
kmem::9:
wheel::10:root
ftp::11:
mail::12:
uucp:x:14:
log::19:root
smmsp::25:
http:x:33:
games::50:
dbus:x:81:
hal:x:82:
avahi:x:84:
network:x:90:
video:x:91:
audio::92:florian,mpd
optical::93:hal,florian
floppy:x:94:hal
storage:x:95:hal
scanner:x:96:florian
camera:x:97:florian
power:x:98:
nobody::99:
users::100:florian
mpd:x:500:
florian:x:1000:
tex:x:1001:


Gruß, Florian

BLUESCREEN3D
07-02-2009, 18:41
Du musst "sort" statt "sort -n" nutzen.

ContainerDriver
07-02-2009, 19:25
Hmm, stimmt, woher sollte join auch wissen, dass es sich beim Join-Kriterium um Zahlen handelt? Danke schon mal! :)

Dummerweise meckert join immer noch, dass die Datei nicht sortiert ist, wenn Zeilen wie


mpd:x:500:
games::50:
tty::5:

vorkommen, join hätte die wohl gerne umgekehrt. Konnte dazu nichts in der Manpage zu sort finden, kann man das sort irgendwie beibringen?

Gruß, Florian

jeebee
07-02-2009, 22:30
Bei mir werden solche Gruppen in der Reihenfolge

tty::5:
games::50:
mpd:x:500:
sortiert und dein Codeschnipsel mit join funktioniert tadellos.

sort (GNU coreutils) 6.10

ContainerDriver
07-02-2009, 22:35
sort --version sagt bei mir "sort (GNU coreutils) 6.12". Kannst du mal bitte deine Ausgabe von locale posten? Meine ist:


LANG=de_DE.utf8
LC_CTYPE="de_DE.utf8"
LC_NUMERIC="de_DE.utf8"
LC_TIME="de_DE.utf8"
LC_COLLATE=C
LC_MONETARY="de_DE.utf8"
LC_MESSAGES="de_DE.utf8"
LC_PAPER="de_DE.utf8"
LC_NAME="de_DE.utf8"
LC_ADDRESS="de_DE.utf8"
LC_TELEPHONE="de_DE.utf8"
LC_MEASUREMENT="de_DE.utf8"
LC_IDENTIFICATION="de_DE.utf8"
LC_ALL=

jeebee
07-02-2009, 22:50
LANG=de_CH.UTF-8
LC_CTYPE="de_CH.UTF-8"
LC_NUMERIC="de_CH.UTF-8"
LC_TIME="de_CH.UTF-8"
LC_COLLATE="de_CH.UTF-8"
LC_MONETARY="de_CH.UTF-8"
LC_MESSAGES="de_CH.UTF-8"
LC_PAPER="de_CH.UTF-8"
LC_NAME="de_CH.UTF-8"
LC_ADDRESS="de_CH.UTF-8"
LC_TELEPHONE="de_CH.UTF-8"
LC_MEASUREMENT="de_CH.UTF-8"
LC_IDENTIFICATION="de_CH.UTF-8"
LC_ALL=

ContainerDriver
08-02-2009, 13:26
Danke, LC_COLLATE scheint der Übeltäter bei mir zu sein, setze ich die Variable auf "de_DE.utf8", dann wird es so sortiert wie ich will.

Gruß, Florian