AWKを介してテキストファイルの配列を取得する効率的な方法

AWKを介してテキストファイルの配列を取得する効率的な方法

約10,000個の数字を含む配列SPLNOがあります。次に、MDN.TXTファイル(約1.5lacレコードを含む)から配列で加入者番号を検索したいと思います。加入者番号が配列に見つかった場合は、次のようにします。私の問題は、数値に対して10kレコードの配列全体を取得するため、時間がかかることです。したがって、1.5lacレコードの場合は繰り返されます(1.5lac * 10K)。効率的な方法を提案してください。

SPLNO.TXT 例:

918542054921|30|1|2
918542144944|12|1|2
918542155955|12|1|2 918542166966|12 |1|2 918542355955|12|
2 9 1 8542455955|12|1|2 918542555955 |12|1| 2 918542955955|12|1|2




MDN.TXTの例:

8542166966
8542355955
8542555955

awk -F"|"  'FNR==1 { ++counter}
counter==1 {SPLNOPULSE[$1]=$4;SPLNOAMT[$1]=$3;SPLNOMAXLEN[$1]=$2;next}
{
for ( mdn in SPLNOMAXLEN)
        {
         if ( ($1 ~ "^"mdn && length($1) <=SPLNOMAXLEN[mdn]) || ("91"$1 ~ "^"mdn && length("91"$1) <=SPLNOMAXLEN[mdn]) )
              {                              
                print found
               }
         else
                print not found
        }                             
 } ' SPLNO.TXT MDN.TXT

ベストアンサー1

これは使用する1つの方法ですperl

#!/usr/bin/perl
# read the subscribers
open(A,"<","SPLNO.TXT");
while(<A>) {
 chomp;
 @a=split(/\|/,$_);
 $splnopulse{$a[0]}=$3;
 $splnoamt{$a[0]}=$2;
 $splnomaxlen{$a[0]}=$1;
}
close A;

# read the mdn, looking for matches
open(B,"<","MDN.TXT");
while(<B>) {
 chomp;
 @b=split(/\|/,$_);
 foreach $mdn (keys %splnomaxlen) {
  if($mdn eq $b[0] || "$mdn" eq "91" . $b[0]) {
   print "found\n";
  } else {
   print "not found\n";
  }
 }
}
close B;

おすすめ記事