2013-10-21 39 views
1

請幫我解決這個問題。我有如下形式的文件打印兩個圖案之間的線條到新文件

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

您應該嘗試詢問具體問題,請查看FAQ – Bruce

回答

0

好吧,把所有的輸入放到一個數組中,用Regex遍歷它,直到找到ABC的東西,打開something.txt作爲Outp ut,繼續通過陣列將行打印到輸出,直到找到XYZ並繼續。

我假設你知道如何編寫Perl。

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關閉打開的文件,以便它在創建多個文件時不會用盡空間

+0

爲避免將空行打印到這些文件中,可以使用'$ 0 {print> f「.txt}',這樣如果$ 0爲空,條件將不匹配。 – fedorqui

+0

這可能很好,可能不好做。如果起始端和結束端之間有空間,它們也會丟失。 – Jotne

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"; 
    } 
} 
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 
0
awk '/ABC/{name="file "$2".txt";}{print >name}' your_file 
相關問題