2010-09-04 32 views
7

Tôi có một tập tin văn bản với một điểm đánh dấu ở đâu đó ở giữa:chia thành hai sử dụng bash script

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

Tôi chỉ cần chia nhỏ tập tin này trong hai tập tin, lần đầu tiên có chứa tất cả mọi thứ trước khi MARKER, và thứ hai chứa mọi thứ sau MARKER. Dường như nó có thể được thực hiện trong một dòng với awk hoặc sed, tôi chỉ không thể tìm ra cách.

Tôi đã thử một cách dễ dàng - sử dụng csplit, nhưng csplit không hoạt động tốt với văn bản Unicode.

Trả lời

4

Hãy thử điều này:

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

Nó sẽ đọc đầu vào từ final.txt và sản xuất out1.txt, out2.txt, vv ...

+0

Hầu như làm việc. Không vít lên UTF-8, nhưng lá * MARKER * trong tập tin thứ hai. –

+0

Bạn đã thử giải pháp được hiển thị ở đây: http://www.unix.com/shell-programming-scripting/41060-split-file-into-seperate-files.html - Nó sử dụng 'csplit' và hoạt động theo cách bạn muốn , có nghĩa là, để cho các điểm đánh dấu ra các tập tin. –

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

Hoặc tất cả trong một:

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

Lệnh split sẽ gần như thực hiện những gì bạn muốn:

$ 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 

Có lẽ nó đủ gần cho nhu cầu của bạn.

Tôi không biết liệu nó có tốt hơn với Unicode hơn csplit hay không.

+0

Tùy chọn đó dường như không có sẵn trong phiên bản phân tách có trong lõi lõi của GNU; Tôi giả sử bạn đang sử dụng một BSD của một số hương vị. Trong bất kỳ trường hợp nào, trên các hệ điều hành dựa trên GNU giống như hầu hết các bản phân phối Linux, các lõi bao gồm cả chia tách và csplit, vì vậy chúng nên có hành vi Unicode tương tự. –

10

bạn có thể làm điều đó một cách dễ dàng với awk

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

+1: Looove it. Vì vậy, súc tích và thanh lịch. Tôi đã cần điều này để loại bỏ một phần lớn rác ra khỏi các bản ghi đến từ kịch bản xây dựng được cấu hình kém. – Rekin

Các vấn đề liên quan