2013-08-22 24 views
3

我有一個巨大的文本數據文件(〜100MB),它是一串數據文件與各種標題信息,然後是一些數據列的串聯。這是問題。我想從每個這些數據集之前的標題信息中提取一個特定的數字,然後將其附加到數據中的另一列(並將數據寫入另一個文件)。Perl正則表達式匹配文本字符串和提取以下編號

,我想報頭信息的格式是恩:BGA 1

哪裏是我想要的,額外的數據列字BGA後#。它將是1到20000之間的一個數字。我可以編寫正則表達式來拉動單詞BGA,但我似乎無法弄清楚如何在數字之後獲取數字。

要添加額外的樂趣,在每個數據段TWICE中重複顯示文本「BGA 1」。

這是我到目前爲止,實際上不工作......我希望它至少打印「BGA」,每次遇到單詞BGA,但它不打印....任何幫助將不勝感激。

#!/usr/bin/perl 
use strict; 
use warnings; 
my $file = 'alldata.txt'; 
open my $info, $file or die "Could not open $file: $!"; 
$_=""; 

while(my $line = <$info>){ 

    if ($line eq "/BGA/"){ 
    print <>,"\n"; 
     } 
} 
close $file; 

回答

2
if ($line =~ /BGA\s(\d+)/){ 
    #your code 
    print "BGA number $1 \n"; 
    #your code 
} 

而且$1變量將有你想要

0

如果每行一個以上的BGA數量,你需要讓正則表達式匹配不是每行一次:

while (my $line = <$info>) { 
    while ($line =~ /BGA\s(\d+)/g) { 
    print "$1\n"; 
    } 
} 

這應該將所有的BGA數字打印出來作爲一個列。沒有任何進一步的信息,很難回答這個問題。

0

首先,一個100 MB的文件並不是巨大的。不要這麼失敗。你甚至可以啜到內存:

讓我們來看看在你的代碼中的幾個關鍵的地方:

while(my $line = <$info>) { 
    if ($line eq "/BGA/") { 

你的條件$line eq "/BGA/"測試如果線路字面上包含字符串"/BGA/"的。但是,對於至少具有輸入記錄分隔符的行來說,這絕不是真的,即最後的內容$/因爲你沒有chomp它。在任何情況下,你想要的是匹配包含"BGA"任何地方和適當的Perl的語法來做到這一點是

if ($line =~ /BGA/) { 

現在,一旦你解決這個問題,你會用下面的語句碰到一個問題行:

print <>,"\n"; 

你真正想要的是print $line;。列表上下文中的鑽石運算符<>將嘗試從STDIN或在命令行上指定爲參數的任何文件中啜泣。不是一個好主意。

其他人指出如何匹配字符串"BGA"後跟一個數字。爲了獲得更好的答案,您將需要顯示輸入和預期輸出的示例。