Artur Pyszczuk's blog...

"Everything is okay in the end, if it's not ok, then it's not the end."
Unknown
/home/linux/commands/csplit/

csplit - Rozdzielanie pliku na części według wzorca

Polecenie csplit jest podobne do polecenia split, tylko trochę bardziej rozbudowane. W gruncie rzeczy podstawowe opcje są prawie analogiczne, tylko dodatkowo mamy możliwość skorzystania z wzorca, o którym za chwilę powiem. Użycie tego programu wygląda następująco.

$ csplit [OPCJE] PLIK WZORZEC

Jeśli plik nie zostanie podany, to dane wczytywane są ze standardowego wejścia. Generalnie polecenie csplit rozdziela plik na pewne części. O tym, jakie to są części decyduje wzorzec, który może być jedną z następujących części.

OFFSET jest liczbą całkowitą, dodatnią (z plusem, lub bez) lub ujemną (z minusem), która do wyniku dodaje OFFSET linii (przykład poniżej). Domyślnie polecenie csplit drukuje na standardowe wyjście liczbę bajtów każdego pliku, który został utworzony.

Podstawowy przykład użycia tego polecenia może być następująco. Mamy plik ze skryptem i chcemy zapisać do innego pliku na przykład trzy pierwsze wiersze. Możemy użyć następującego sposobu.

Polecenie csplit
Rys. 1. Polecenie csplit


Jak widać na rysunku powyżej, za pomocą csplit utworzyliśmy dwa pliki, których rozmiary zostały wydrukowane na standarowe wyjście. Pierwszy z nich ma nazwę xx00, drugi xx01. Nazwy te oczywiście można zmieniać, za co odpowiadają odpowiednie opcje, opisane w dalszej części. Tak więc użycie w tym przypadku było następujące, podaliśmy nazwę pliku, a po niej liczbę dziesiętną, która określa do którego wiersza od początku nie wliczając go mają zostać zapisane dane w pierwszym z tworzonych plików. W drugim pliku jest reszta pliku 1.c.

Aby zmienić dowolnie nazwy musimy użyć opcji -f (domyślnie xx). Opcja -b odpowiada za drugą część nazwy plików (00, 01 itp). Tutaj natomiast trzeba użyć jedego z deskryptorów formatu z funkcji printf, z języka C. W każdym bądź razie literki 'd', 'i', 'u', 'o', 'x' oraz 'X' są dozwolone, poprzedzić je trzeba znakiem %. Nasza pliki z poprzedniego przykładu mogą nazwywać się dowolnie, przykład poniżej.

Polecenie csplit
Rys. 2. Polecenie csplit - dowolne nazwy


Może interesować nas, aby nazwy plików miały na przykład kilka cyfr, tak więc do tego celu użyjemy opcji -n.

Polecenie csplit
Rys. 3. Polecenie csplit - dowolne nazwy, dłuższe liczby


W przypadku wystąpienia błędu, nowo tworzone pliki z zawartością częściową pliku bazowego są usuwane, aby temu zapobiec należy użyć opcji -k. Na poniższym przykładzie próbujemy zapisać pierwszych sto linii do nowego pliku, lecz plik bazowy niestety nie ma tylu wierszy. Z użyciem opcji -k plik ten zostaje, co widać. Bez tej opcji, plik jest usuwany.

Polecenie csplit
Rys. 4. Polecenie csplit - zostawienie pliku w przypadku błędu


Domyślnie rozmiar plików, do których dane zostały zapisane jest drukowany na ekranie. Jeśli chcemy, aby ta informacja nie była drukowana możemy ją wyłączyć za pomoca opcji -s

Polecenie csplit
Rys. 5. Polecenie csplit - brak informacji o rozmiarze plików


Jeśli jako liczbę całkowitą po nazwie podamy 1, to oznaczać będzie, że pierwszy plik będzie pusty. Po co więc tworzyć pusty plik? Można zapobiec tworzeniu pustego pliku opcją -z.

Polecenie csplit
Rys. 6. Polecenie csplit - usuwanie pustych plików


Do tej pory wszystkie opcje zostały przedstawione na przykładzie kopiowania ilości wierszy, lecz polecenie split posiada opcję wstawiania wyrażeń regularnych (ang. Regular Expressions - REGEXP). Wyrażenia regularne to zagadnienie na osobną stronę. W tym miejscu nie będą one tłumaczone, ale sposób użycia zostanie pokazany (bardzo prosty przykład, nic złożonego).

Na początku tej strony zostały wymienione wzorce. Przez wszystkie do tej pory przykłady został używany wzorzec INTEGER. Pozostałe dwa też się przydają, nawet chyba bardziej są przydatne. Założmy, że chcemy skopiować z pliku 1.c, tylko funkcję main, która jest zdefiniowana jako ostatnia w tym pliku. Do tego celu użyjemy %REGEXP%.

Polecenie csplit
Rys. 7. Polecenie csplit - kopiowanie ostatniej funkcji


OFFSET dokonuje modyfikacji miejsca od, lub do którego dane są kopiowane. Dla powyższego przykładu ustawienie OFFSET na +1 spowoduje, że nazwa funkcji wraz z jej parametrami nie zostaną włączone do wyniku - zostanie tylko ciało funkcji i nawiasy klamrowe. Jeśli OFFSET będzie -1 to analogicznie, dane zostaną kopiowane od jednego wiersza wcześniej, niż znaleziony wzorzec.

Polecenie csplit
Rys. 8. Polecenie csplit - kopiowanie ostatniej funkcji, offset +1, -1


/REGEXP/ oznacza, że dane kopiowane są do tego wzorca, nie włączając go do wyniku. OFFSET działa na tej samej zasadzie, co w poprzednim przypadku.

Polecenie csplit
Rys. 9. Polecenie csplit - kopiowanie początkowych funkcji



Wiecej informacji na temat programu csplit znajdziesz w podreczniku systemowym man.
Wpisujac w konsoli man csplit

Wiecej informacji na temat programu csplit znajdziesz również w programie info.
Wpisujac w konsoli info coreutils 'csplit invocation'

Some rights reserved 2010 - 2015 Artur Pyszczuk

| Strona Główna | Kontakt |