我有一个文件,我需要拆分成多个文件,需要通过单独的开始和结束分隔符完成。
例如,如果我有以下文件:
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
感谢任何帮助。
答案 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
如果您的范围是或将永远不包括目的,那么其他答案肯定会更好。