2010-09-04 10 views
7

Mam plik tekstowy z markerem gdzieś w środku:podzielonego pliku tekstowego w dwóch użyciu skryptu bash

one 
two 
three 
blah-blah *MARKER* blah-blah 
four 
five 
six 
... 

po prostu trzeba podzielić ten plik w dwóch plikach, pierwszy zawierający wszystko przed MARKERA, i drugi zawierający wszystko po MARKER. Wygląda na to, że można to zrobić w jednym wierszu z awk lub sed, po prostu nie wiem jak.

Spróbowałem w łatwy sposób - używając csplit, ale csplit nie gra dobrze z tekstem Unicode.

Odpowiedz

4

Spróbuj tego:

awk '/MARKER/{n++}{print >"out" n ".txt" }' final.txt 

To będzie czytać wejście z final.txt i produkuje out1.txt, out2.txt, etc ...

+0

Prawie pracował. Nie zepsuje UTF-8, ale pozostawia * MARKER * w drugim pliku. –

+0

Czy próbowałeś rozwiązania pokazanego tutaj: http://www.unix.com/shell-programming-scripting/41060-split-file-into-seperate-files.html - Używa 'csplit' i działa tak, jak chcesz , czyli wypuszczenie znacznika plików. –

3
sed -n '/MARKER/q;p' inputfile > outputfile1 
sed -n '/MARKER/{:a;n;p;ba}' inputfile > outputfile2 

lub wszystkie w jednym:

sed -n -e '/MARKER/! w outputfile1' -e'/MARKER/{:a;n;w outputfile2' -e 'ba}' inputfile 
1

Komenda split prawie wykona to, co chcesz:

$ split -p '\*MARKER\*' splitee 
$ cat xaa 
one 
two 
three 
$ cat xab 
blah-blah *MARKER* blah-blah 
four 
five 
six 
$ tail -n+2 xab 
four 
five 
six 

Być może jest wystarczająco blisko, aby spełnić Twoje potrzeby.

Nie mam pojęcia, czy ma to coś lepszego z Unicode niż csplit.

+0

Ta opcja nie wydaje się być dostępna w wersji podziału zawartej w GNU coreutils; Zakładam, że używasz BSD o pewnym smaku. W każdym razie, w systemach operacyjnych opartych na GNU, jak większość dystrybucji Linuksa, coreutils obejmuje zarówno split, jak i csplit, więc powinny mieć podobne zachowanie w Unicode. –

10

można to zrobić łatwo z awk

awk -vRS="MARKER" '{print $0>NR".txt"}' file 
+0

+1: Looove it. Tak zwięzły i elegancki. Potrzebowałem tego, aby odrzucić dużą część śmieci z dzienników pochodzących ze źle skonfigurowanego skryptu kompilacji. – Rekin

Powiązane problemy