Istnieje wiele sposobów na łączenie i sortowanie plików tekstowych w Linuksie, ale jak się do tego zabrać zależy od tego, co próbujesz osiągnąć – czy chcesz po prostu umieścić zawartość wielu plików w jednym dużym pliku, czy zorganizować ją w jakiś sposób, który ułatwi jej użycie. W tym poście przyjrzymy się kilku poleceniom do sortowania i łączenia zawartości plików i skupimy się na tym, jak różnią się wyniki.
Używanie cat
Jeśli wszystko, co chcesz zrobić, to zebrać grupę plików w jeden plik, polecenie cat jest łatwym wyborem. Wszystko co musisz zrobić, to wpisać „cat”, a następnie wypisać pliki w wierszu poleceń w kolejności, w jakiej chcesz je włączyć do połączonego pliku. Przekieruj wyjście polecenia do pliku, który chcesz utworzyć. Jeśli plik o podanej nazwie już istnieje, zostanie on nadpisany przez ten, który tworzysz. Na przykład:
$ cat firstfile secondfile thirdfile > newfile
Jeśli chcesz dodać zawartość serii plików do istniejącego pliku zamiast go nadpisywać, po prostu zmień > na >>.
$ cat firstfile secondfile thirdfile >> updated_file
Jeśli pliki, które scalasz, są zgodne z jakąś wygodną konwencją nazewnictwa, zadanie to może być jeszcze prostsze. Nie będziesz musiał uwzględniać wszystkich nazw plików, jeśli możesz je określić za pomocą wyrażenia regularnego. Na przykład, jeśli wszystkie pliki kończą się słowem „plik”, jak w powyższym przykładzie, możesz zrobić coś takiego:
$ cat *file > allfiles
Zauważ, że polecenie pokazane powyżej doda zawartość plików w kolejności alfanumerycznej. W systemie Linux, plik o nazwie „filea” zostałby dodany przed plikiem o nazwie „fileA”, ale po pliku o nazwie „file7”. W końcu nie musimy po prostu myśleć „ABCDE”, gdy mamy do czynienia z sekwencją alfanumeryczną; musimy myśleć „0123456789aAbBcCdDeE”. Zawsze możesz użyć polecenia takiego jak „ls *file”, aby zobaczyć kolejność, w jakiej pliki zostaną dodane przed połączeniem plików.
UWAGA: Dobrym pomysłem jest upewnienie się, że twoje polecenie zawiera wszystkie pliki, które chcesz mieć w połączonym pliku i żadnych innych – szczególnie, gdy używasz dzikiej karty takiej jak „*”. Nie zapominaj też, że połączone pliki będą nadal istnieć jako osobne pliki, które możesz chcieć usunąć po sprawdzeniu poprawności połączenia.
Łączenie plików według wieku
Jeśli chcesz połączyć pliki na podstawie wieku każdego z nich, a nie według nazw plików, użyj polecenia takiego jak to:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
Użycie opcji -tr (t=czas, r=odwrotność) spowoduje wyświetlenie listy plików w kolejności najstarszy-pierwszy wiek. Może to być przydatne, na przykład, jeśli prowadzisz dziennik pewnych czynności i chcesz, aby zawartość była dodawana w kolejności, w jakiej czynności te były wykonywane.
$ w powyższym poleceniu reprezentuje identyfikator procesu dla polecenia, gdy je uruchomisz. Używanie tego jest całkowicie zbędne, ale sprawia, że jest prawie niemożliwe, że nieumyślnie dodasz na koniec istniejącego pliku zamiast tworzyć nowy. Jeśli użyjesz $$, plik wynikowy może wyglądać tak:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Łączenie i sortowanie plików
Linux zapewnia kilka interesujących sposobów sortowania zawartości pliku przed lub po scaleniu.
Sortowanie zawartości alfabetycznie
Jeśli chcesz, aby zawartość scalonego pliku była posortowana, możesz posortować ogólną zawartość za pomocą polecenia takiego jak to:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Jeśli chcesz zachować zawartość pogrupowaną według plików, posortuj każdy plik przed dodaniem go do nowego pliku za pomocą polecenia takiego jak to:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Sortowanie plików numerycznie
Aby posortować zawartość pliku numerycznie, użyj opcji -n z sort. Opcja ta jest przydatna tylko wtedy, gdy linie w twoich plikach zaczynają się od liczb. Pamiętaj, że w domyślnej kolejności, „02” byłoby uważane za mniejsze niż „1”. Użyj opcji -n, gdy chcesz mieć pewność, że linie są posortowane w kolejności numerycznej.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
Opcja -n pozwala również na sortowanie zawartości plików według daty, jeśli linie w plikach zaczynają się od dat w formacie takim jak „2020-11-03” lub „2020/11/03” (format roku, miesiąca, dnia). Sortowanie według dat w innych formatach będzie kłopotliwe i będzie wymagało znacznie bardziej złożonych poleceń.
Używanie polecenia wklej
Polecenie wklejania umożliwia łączenie zawartości plików na zasadzie linia po linii. Kiedy używasz tego polecenia, pierwszy wiersz połączonego pliku będzie zawierał pierwszy wiersz każdego z łączonych plików. Oto przykład, w którym użyłem wielkich liter, aby łatwo było zobaczyć, skąd pochodzą poszczególne linie:
$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five
Przekieruj wyjście do innego pliku, aby je zapisać:
$ paste file.a file.b file.c > merged_content
Alternatywnie, możesz wkleić pliki razem tak, aby zawartość każdego z nich była połączona w pojedynczym wierszu. Wymaga to użycia opcji -s (sekwencyjne). Zauważ, że tym razem na wyjściu widać zawartość każdego pliku:
$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five
Użycie join
Innym poleceniem służącym do łączenia plików jest join. Polecenie join pozwala na łączenie zawartości wielu plików w oparciu o wspólne pole. Na przykład, możesz mieć jeden plik, który zawiera numery telefonów grupy współpracowników i inny, który zawiera ich osobiste adresy e-mail i oba są wymienione według nazwisk osób. Możesz użyć join, aby utworzyć plik z numerami telefonów i adresami e-mail.
Jednym ważnym ograniczeniem jest to, że pliki muszą mieć linie wymienione w tej samej kolejności i zawierać pole join w każdym pliku.
Oto przykładowe polecenie:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
W tym przykładzie, pierwsze pole (imiona) musi istnieć w każdym pliku, nawet jeśli brakuje dodatkowych informacji lub polecenie zakończy się niepowodzeniem z błędem. Sortowanie zawartości jest pomocne i prawdopodobnie dużo łatwiejsze do zarządzania, ale nie jest wymagane tak długo, jak kolejność jest spójna.
Wrap-Up
Masz wiele opcji w Linuksie do łączenia i sortowania danych przechowywanych w oddzielnych plikach. Wybór ten może sprawić, że niektóre żmudne zadania staną się zaskakująco łatwe.