2009-06-12 12 views
13

mam dwa pliki, gdzie chcę wykonać operacji Unii na podstawie 1 kolumna:Dopełnienie pustym polu w Unix Dołącz Operation

plik1.txt

foo 1 
bar 2 
qux 3 

file2.txt

foo x 
qux y 
boo z 

Wynik, który mam nadzieję uzyskać, jest następujący:

foo 1 x 
bar 2 - 
qux 3 y 
boo - z 

gdzie puste pola w kolumnie 1 są wypełnione z "-".

Ale dlaczego to polecenie łączenia nie działa tak, jak się spodziewałem?

$ join -a1 -a2 -e"-" file1.txt file2.txt 

Co to jest właściwy sposób?

Odpowiedz

21

"Ważne: pliki FILE1 i FILE2 muszą być posortowane w polach łączenia." (z this strony podręcznika online).

Ten problem nr 1. Zadanie nr 2 jest gorsze: opcja -e jest źle udokumentowane - działa tylko w połączeniu z -o, więc na przykład:

$ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt 
bar 2 - 
boo - z 
foo 1 x 
qux 3 y 

gdzie nazwa s prefiks wskazane pliki, które mam sort ed wcześniej.

Edytuj: man join wyjaśnia przełącznik -o (tak samo, jak na stronie internetowej wskazuję powyżej). Określa pola do wydrukowania (1.2 oznacza drugie pole z pliku 1, & c) lub 0 w celu oznaczenia pola łączenia i jest listą rozdzielaną przecinkami. (Właściwie nie pamiętam wartości 0, więc pierwotnie otrzymałem bardziej niezrozumiałe rozwiązanie, które wymaga przetwarzania postu w awk, ale obecne rozwiązanie jest lepsze ... i nie jest potrzebne awk!).

+0

@Alex: dzięki tak dużo. Nie rozumiem opcji "-o" 1.1,2.1,1.2,2.2 "". Gdzie mogę znaleźć informacje na ten temat? A jeśli nie masz nic przeciwko awk? – neversaint

+1

Edytowałem odpowiedź, aby wyjaśnić -o, ale spójrz na 'man awk': tak jak ja, aby sprawdzić moje wyjaśnienie, przypomniano mi o wartości 0 dla numeru pola, które teraz użyłem w edytowany przykład i sprawia, że ​​przetwarzanie końcowe jest niepotrzebne. Ale pamiętaj, aby wcześniej posortować pliki! -) –

+0

@Alex, dzięki milionowi. – neversaint

2

-e działa tylko z -o

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt