Many a times you may have multiple files that needs to merged into one single file. To może być, że wcześniej podzielić pojedynczy plik na wiele plików, i chcesz po prostu połączyć je z powrotem lub masz kilka plików dziennika, które chcesz połączyć w jeden. Niezależnie od powodu, bardzo łatwo jest połączyć wiele plików tekstowych w jeden plik w Linuksie.
Komenda w Linuksie do konkatenacji lub łączenia wielu plików w jeden plik nazywa się cat. Polecenie cat domyślnie będzie konkatenować i wypisywać wiele plików na standardowe wyjście. Możesz przekierować standardowe wyjście do pliku za pomocą operatora ’>’, aby zapisać wyjście na dysku lub w systemie plików.
Innym użytecznym narzędziem do łączenia plików jest join, które może połączyć linie dwóch plików w oparciu o wspólne pola. Może jednak pracować tylko na dwóch plikach jednocześnie, a ja uznałem, że jest to dość kłopotliwe w użyciu. W tym poście zajmiemy się głównie komendą cat.
Łączenie wielu plików w jeden w kolejności
Komenda cat przyjmuje listę nazw plików jako swój argument. Kolejność, w jakiej nazwy plików są podane w wierszu poleceń, dyktuje kolejność, w jakiej pliki są łączone lub scalane. Tak więc, jeśli masz kilka plików o nazwach plik1.txt, plik2.txt, plik3.txt itd…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
Powyższe polecenie spowoduje dołączenie zawartości pliku2.txt do końca pliku1.txt. Zawartość pliku3.txt jest dołączana do końca połączonych zawartości plików1.txt i plik2.txt i tak dalej… a cały połączony plik jest zapisywany pod nazwą mergedfile.txt w bieżącym katalogu roboczym.
Wielokrotnie może się zdarzyć, że masz nieproporcjonalnie dużą liczbę plików, co utrudnia wpisanie wszystkich nazw plików. Polecenie cat akceptuje wyrażenia regularne jako nazwy plików wejściowych, co oznacza, że można ich użyć do zmniejszenia liczby argumentów.
bash$ cat file*.txt my*.txt > mergedfile.txt
To połączy wszystkie pliki w bieżącym katalogu, które zaczynają się od nazwy plik i mają rozszerzenie txt, a następnie pliki, które zaczynają się od my i mają rozszerzenie txt. Musisz być ostrożny przy używaniu wyrażeń regularnych, jeśli chcesz zachować kolejność plików. Jeśli źle ustawisz wyrażenie regularne, wpłynie to na dokładną kolejność, w jakiej pliki zostaną połączone.
Szybkim i łatwym sposobem na upewnienie się, że pliki zostaną połączone dokładnie w takiej kolejności, w jakiej chcesz, jest użycie wyjścia innego programu listującego pliki, takiego jak ls lub find i przesłanie go do polecenia cat. Najpierw wykonaj polecenie find z wyrażeniem regularnym i zweryfikuj kolejność plików…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Wyświetli to pliki w takiej kolejności, że będziesz mógł zweryfikować ich poprawność lub zmodyfikować je tak, aby pasowały do tego, co chcesz. Możesz następnie potokować to wyjście do polecenia cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Gdy łączysz wiele plików w jeden plik używając wyrażeń regularnych do ich dopasowania, szczególnie gdy jest to potokowane i gdy plik wyjściowy nie jest zbyt oczywisty, upewnij się, że wyrażenie regularne nie pasuje do nazwy połączonego pliku. W przypadku, gdy pasuje, zwykle polecenie cat jest całkiem dobre w wypisywaniu błędów z komunikatem „plik wejściowy jest plikiem wyjściowym”. Ale pomaga być ostrożnym, aby zacząć.
Połącz dwa pliki w arbitralnej lokalizacji
Czasami możesz chcieć połączyć dwa pliki, ale w określonym miejscu w zawartości pliku. To jest bardziej jak proces wstawiania zawartości jednego pliku do drugiego w określonej pozycji w pliku.
Jeśli rozmiary plików są małe i możliwe do zarządzania, to vi jest świetnym narzędziem do tego. W przeciwnym razie opcją jest podzielenie pliku najpierw, a następnie połączenie plików wynikowych w kolejności. Najprostszym sposobem jest podzielić plik jest oparty na numerach linii, dokładnie w miejscu, gdzie chcesz wstawić inny plik.
bash$ split -l 1234 file1.txt
Możesz podzielić plik na dowolną liczbę plików wyjściowych w zależności od wymagań. Powyższy przykład podzieli plik file1.txt na kawałki o długości 1234 linii. Jest całkiem możliwe, że możesz skończyć z więcej niż dwoma plikami, o nazwach xaa, xab, xac itp. Możesz scalić je wszystkie z powrotem za pomocą tego samego polecenia cat, jak wspomniano wcześniej.
bash$ cat xaa file2.txt xa{b..z}
Powyższe polecenie połączy pliki w kolejności z zawartością file2.txt pomiędzy zawartością xaa i xab.
Innym przypadkiem użycia jest, gdy trzeba scalić tylko określone części niektórych plików w zależności od jakiegoś warunku. Jest to szczególnie przydatne dla mnie, gdy muszę przeanalizować kilka dużych plików dziennika, ale jestem zainteresowany tylko niektórymi wiadomościami lub liniami. Tak więc, będę musiał wyodrębnić ważne komunikaty dziennika w oparciu o pewne kryteria z kilku plików dziennika i zapisać je w innym pliku, jednocześnie zachowując lub zachowując kolejność komunikatów.
Chociaż możesz to zrobić używając poleceń cat i grep, możesz to zrobić również za pomocą samego polecenia grep.
bash$ grep -h "" logfile*.log > onlyerrors.log
Powyżej wyodrębnisz wszystkie linie, które pasują do wzorca i zapiszesz je w innym pliku. Będziesz musiał upewnić się, że pliki dziennika są w porządku, gdy używasz wyrażenia regularnego do ich dopasowania, jak wspomniano wcześniej w poście.