根据不同的开始和结束分隔符将文件拆分为多个文件

时间:2014-01-27 17:18:24

标签: regex command-line awk split delimiter

我有一个文件,我需要拆分成多个文件,需要通过单独的开始和结束分隔符完成。

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

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

我需要3个单独的文件:

文件1

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您可以使用此awk命令:

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

答案 2 :(得分: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

这是Ed Morton评论之后没有重复/START/正则表达式的版本,因为我只想看看它是否有用:

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

如果您的范围是或将永远不包括目的,那么其他答案肯定会更好。