2014-01-27 39 views
2

我有一個文件,我需要拆分爲多個文件,並且需要通過單獨的開始和結束分隔符完成。根據不同的起始和結束分隔符將文件拆分爲多個文件

例如,如果我有以下文件:

abcdef 
START 
ghijklm 
nopqrst 
END 
uvwxyz 
START 
abcdef 
ghijklm 
nopqrs 
END 
START 
tuvwxyz 
END 

我需要3個單獨的文件:

file1的

START 
ghijklm 
nopqrst 
END 

file2的

START 
abcdef 
ghijklm 
nopqrs 
END 

file3的

START 
tuvwxyz 
END 

我發現了this鏈接,顯示瞭如何使用起始分隔符做到這一點,但我也需要結尾分隔符。我已經試過這在awk命令中使用一些正則表達式,但沒有得到我想要的結果。我不太明白如何讓awk變得「懶惰」或「非貪婪」,這樣我就可以正確地拉開文件。

我真的很喜歡awk解決方案。類似的事情將是太棒了(我在這裏重新發布的解決方案,使您不必通過點擊:

awk '/DELIMITER_HERE/{n++}{print >"out" n ".txt" }' input_file.txt

任何幫助表示讚賞

回答

2

您可以使用此awk命令:

awk '/^START/{n++;w=1} n&&w{print >"out" n ".txt"} /^END/{w=0}' input_file.txt 
+0

我喜歡這個解決方案最好。它對我來說非常合適,而且我只需要在命令中輸入一次分隔符(分隔符要比實例中使用的START和END分隔符長得多)。謝謝。 – jasonmclose

+0

不客氣,很高興它解決了。 – anubhava

4
awk ' 
    /START/ {p = 1; n++; file = "file" n} 
    p { print > file } 
    /END/ {p = 0} 
' filename 
+0

+1年,這就是你如何做到這一點。 –

+0

這工作得很好。感謝你的努力。 – jasonmclose

1

下面是使用range符號又如:

awk '/START/,/END/ {if(/START/) n++; print > "out" n ".txt"}' data 

或等效採用不同的if/else語法:

awk '/START/,/END/ {print > "out" (/START/ ? ++n : n) ".txt"}' data 

這裏不重複後,埃德莫頓的評論/START/正則表達式,因爲我只是想看看它是否會工作的一個版本:

awk '/START/ && ++n,/END/ {print > "out" n ".txt" }' data 

如果你的範圍是或將永遠不包含目的,其他答案肯定更好。

+0

從來沒有使用範圍表示法 - 它使得微不足道的事情變得更簡單,但是當情況變得稍微複雜時,需要完全重寫和/或重複條件(如本例)。 –

相關問題