File1.txt
item1 carA
item2 carB
item3 carC
item4 platD
item5 carE
File2.txt
carA platA
carB platB
carC platC
carE platE
Poszukiwany wynik:
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
Jak mogę to zrobić?
command-line
text-processing
awk
pawana
źródło
źródło
Wiem, że powiedziałeś
awk
, alejoin
w tym celu istnieje polecenie ...Wystarczyłoby pierwsze
join
polecenie, gdyby nie ten wiersz:Komenda w zasadzie mówi: połącz na podstawie drugiej kolumny pierwszego pliku (
-1 2
) i pierwszej kolumny drugiego pliku (-2 1
), i wypisz pierwszą kolumnę pierwszego pliku i drugą kolumnę drugiego pliku (-o 1.1,2.2
). To pokazuje tylko sparowane linie. Drugie polecenie łączenia mówi prawie to samo, ale mówi, aby pokazać wiersze z pierwszego pliku, którego nie można sparować (-v 1
), i wypisać pierwszą kolumnę pierwszego pliku i drugą kolumnę pierwszego pliku (-o 1.1,1.2
). Następnie sortujemy dane wyjściowe obu połączonych.sort -k 1
oznacza sortowanie na podstawie pierwszej kolumny isort -k 2
sortowanie na podstawie drugiej. Ważne jest sortowanie plików na podstawie kolumny łączenia przed przekazaniem ich dojoin
.Teraz napisałem sortowanie dwa razy, ponieważ nie lubię zaśmiecać moich katalogów plikami, jeśli mogę pomóc. Jednak, jak powiedział David Foerster, w zależności od rozmiaru plików, możesz posortować pliki i zapisać je najpierw, aby nie musieć czekać na sortowanie dwa razy. Aby dać wyobrażenie o rozmiarach, oto czas potrzebny na posortowanie 1 miliona i 10 milionów linii na moim komputerze:
To 1,5 sekundy na 1 milion linii i 19 sekund na 10 milionów linii.
źródło
%E
w formacie czasu) jest mniej interesujący do mierzenia wydajności obliczeniowej. Czas procesora w trybie użytkownika (%U
lub po prostuTIMEFORMAT
zmienna nieuzbrojona ) byłby znacznie bardziej znaczący.%U
.