2012-04-13 37 views
2

我有兩個文件如何從一個引用第一個文件的文件中檢索一組兩行文件?

$cat file 1 
Index1 annotation1 
abcd 
Index2 annotation2 
efgh 
Index3 annotation3 
hijk 
Index4 annotation4 
lmno 
Index5 annotation5 
pqrs 
…
$cat file2 
Index1 
Index3 
Index5

我想要得到的是線從文件1和後像下面檢索各行的行列表。

Index1 annotation1 
abcd 
Index3 annotation3 
hijk 
Index5 annotation5 
pqrs

我目前的解決方案是使用grep和它的「文件」標誌 grep -A 1 --file="file2" file1 | awk '!/--/'

但我不知道是否有這個更優雅的解決方案。目前的解決方案時需要的文件是巨大的

回答

2
#!/usr/bin/env perl 

use strict; use warnings; 
use autodie; 

my %to_index; 

my ($annotations_file, $index_file) = @ARGV; 

open my $index, '<', $index_file; 

while (my $line = <$index>) { 
    next unless $line =~ /\S/; 
    chomp $line; 
    $to_index{ $line } = undef; 
} 

close $index; 

open my $annotations, '<', $annotations_file; 

while (my $line = <$annotations>) { 
    next unless $line =~ /\S/; 
    my ($keyword) = ($line =~ /^(\S+)/); 
    if (exists $to_index{ $keyword }) { 
     print $line; 
     print scalar <$annotations>; 
    } 
} 

close $annotations; 
+0

非常感謝您爲整齊的解決方案。使用散列比瘋狂的瘋狂快得多。順便說一下,我修改了腳本以適合我的文件,它工作得很好。我不明白,也沒有使用的一行是'code' my($ keyword)=($ line =〜/ ^(\ S +)/);你能解釋一下這個嗎?這是邏輯清單嗎? – Alby 2012-04-17 02:45:47

+1

它捕獲並將任何初始序列的非空格字符錨定在行的開始處,以'$ keyword'。 – 2012-04-17 03:03:29

+0

謝謝!另一個快速問題是我的($關鍵字)在該行中的括號,是否有必要?我正在學習perl上下文,並且我記得()我保存了列表上下文嗎?但在標量環境中不是這樣嗎? – Alby 2012-04-17 16:16:16

2

我建議通過文件1讀建築,其中每個標籤將出現在文件中的指標很長一段時間。可以從file2中讀取所需數據的標籤,並查閱索引以查看相應信息的讀取位置。

該程序顯示原理。目前還不清楚如何區分標籤和測試的其餘部分。我假設他們都以Index開頭,這可能是錯誤的,但如果您需要幫助將其適用於您的真實數據,請再詢問一次。

use strict; 
use warnings; 

@ARGV = qw/ file1.txt file2.txt/unless @ARGV; 
my ($file1, $file2) = @ARGV; 

my %index; 

open my $f1, '<', $file1 or die qq(Unable to open "$file1": $!); 
my $pos = tell $f1; 
while (<$f1>) { 
    $index{$1} = $pos if /^(Index\S+)/; 
    $pos = tell $f1; 
} 

open my $f2, '<', $file2 or die qq(Unable to open "$file2": $!); 
while (<$f2>) { 
    next unless /^(Index\S+)/ and defined($pos = $index{$1}); 
    seek $f1, $pos, 0; 
    print scalar <$f1>, scalar <$f1>; 
} 

輸出

Index1 annotation1 
abcd 
Index3 annotation3 
hijk 
Index5 annotation5 
pqrs 
相關問題