请帮我解决这个问题。我有以下模式的文件
ABC x
bla bla bla
bla bla
bla
XYZ
ABC y
bla bla bla
bla bla
bla bla bla
XYZ
ABC z
bla bla bla
XYZ
我需要输出文件x.txt
ABC x
bla bla bla
bla bla
bla
XYZ
和
ABC y
bla bla bla
bla bla
bla bla bla
XYZ
在y.txt中等等其他模式
答案 0 :(得分:2)
有些人喜欢这样:
awk '/ABC/ {close(f".txt");f=$2} {print >f".txt"}' file
此测试是否行以ABC
开头,然后将输出文件名设置为$2
EKS
cat y.txt
ABC y
bla bla bla
bla bla
bla bla bla
XYZ
编辑:将close()
添加到awk
以关闭打开的文件,以便在创建多个文件时不会耗尽空间
答案 1 :(得分:0)
好吧,把所有的输入放到一个数组中,然后用Regex遍历它,直到你找到ABC的东西,打开something.txt作为输出,继续通过你的数组打印输出行直到你找到XYZ并继续前进。
我假设您知道如何编写Perl。
答案 2 :(得分:0)
怎么样:
my $fh;
open my $fh_in, '<', "input_file" or die "unable to open 'input_file: $!";
while (<$fh_in>) {
chomp;
if (/^ABC \w+/../XYZ/) {
if (/^ABC (\w+)/) {
open $fh, '>', "$1.txt" or die "unable to open '$1.txt': $!";
}
print $fh $_,"\n";
}
}
答案 3 :(得分:0)
您可以使用sed
执行此操作,如下所示:
sed -n '/ABC x/,/XYZ/p' file > x.txt
如果您了解所有模式,则可以使用循环:
for i in x y z
do
sed -n "/ABC $i/,/XYZ/p" file > "$i".txt
done
答案 4 :(得分:0)
awk '/ABC/{name="file "$2".txt";}{print >name}' your_file