0

请帮我解决一下这个。我有以下模式的文件

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 等其他模式

4

5 回答 5

2

有些像这样:

awk '/ABC/ {close(f".txt");f=$2} {print >f".txt"}' file

此测试是否行开头,ABC然后将输出文件名设置为值$2

埃克斯

cat y.txt
ABC y
bla bla bla
bla bla
bla bla bla
XYZ

编辑:添加close()awk关闭打开的文件,因此如果它创建许多文件,它不会用完空间

于 2013-10-21T07:33:45.367 回答
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
于 2013-10-21T07:51:55.637 回答
0

好吧,将所有输入放入一个数组中,使用正则表达式遍历它,直到找到 ABC 东西,打开 something.txt 作为输出,继续通过数组将行打印到输出,直到找到 XYZ 并继续前进。

我假设您知道如何编写 Perl。

于 2013-10-21T07:29:29.913 回答
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";
    }
}
于 2013-10-21T07:48:28.643 回答
0
awk '/ABC/{name="file "$2".txt";}{print >name}' your_file
于 2013-10-21T11:28:40.920 回答