さて、あなたは苦しむことなく鼻からスパゲッティを食べたいので、私たちはあなたの心を読み、あなたが何をしたいのかを推測します. 1つはスパゲッティを液体にすりつぶす方法、もう1つは口を開けます。
そうは言っても、問題がfile1 である可能性があることに対する私の推測は
、RID と呼ばれるキーと値のペアを保持するある種の構造化データです。それが何なのか、何をしているのか、何を表しているのかはわかりませんが、行間を読むと、file2 に対応するエントリがあります。
現在、file2 も何らかの方法で構造化されており、何らかの形の構造化ブロックにグループ化されたキーと値のペアがあり、複数のブロックがあるように見えます。
さて、問題は、最終的にどのような結果を目指しているのかということです。_ between_the_lines_ を読んで、そのブロックのキーと値のペアであるRIDキーが特定の条件に一致する場合、ブロック全体が必要だと思います。これは正しいです ?
では、その条件とは具体的にどのようなものでしょうか。
私の推測では、BLOCK の RID が FILE1 に存在する場合、SELECT WHOLE_BLOCK from FILE2 の行に沿って何かをしたいということです。
次に、2 つのオプションがあります。file2 が 9000PetaBytes 未満であり、エントリ数も IEEE 52 ビット fp が処理できる数よりも少ないと仮定して、それをメモリに格納します。
echo ""| awk '
function cmd( E, A, this,v){ A[0]=0;while((E |getline v)>0)A[A[0]+=1]=v;A["RETURN_CODE"]=close(E);}
function grep( o, re, p, B, this, a,v ){
B[0]=0;if(o~"-v"){while((getline v < p)>0){if(!match(v,re))B[B[0]+=1]=v;}return B[0];};
if(o~"-o"){while((getline v < p)>0){a=v;while(match(a,re)){B[B[0]+=1]=substr(a,RSTART,RLENGTH);
a=substr(a,RSTART+RLENGTH);}};return B[0];};while((getline v < p)>0){if(match(v,re))B[B[0]+=1]=v;}return B[0];
}
function dbg_printarray(ary , x , s,e, this , i ){x=(x=="")?"A":x;for(i=((s)?s:1);i<=((e)?e:ary[0]);i++){print x"["i"]=["ary[i]"]"}}
function agrep( o, re, A, B, this, a, i,k ){
B[0]=0;k=0;if(o~"-v"){for(i=1;i<=A[0];i++){if(!match(A[i],re)) B[k+=1]=A[i];}B[0]=k;return k;};
if(o~"-o"){for(i=1;i<=A[0];i++){a=A[i];while(match(a,re)){B[B[0]+=1]=substr(a,RSTART,RLENGTH);a=substr(a,RSTART+RLENGTH);};
};B[0]=k;return k;};for(i=1;i<=A[0];i++){if(match(A[i],re))B[k+=1]=A[i];};B[0]=k;return k;
}
{
SAFETY_SINCE_WE_WALK_IN_THE_DARK=2000;
input="file1";
lookup_file="file2";
output="output.data";
we_died = 0;
# Instead of -i option to zgrep, use [Aa][Nn][Tt] way of representation.
PATTERN = "[Rr][Ii][Dd]=[0-9a-zA-Z]*";
if(for_gods_sake_we_are_scanning_normal_uncompressed_content){
grep("-o", PATTERN , input , A);
}else{
cmd("zgrep -o \""PATTERN"\" \""input"\" ",A);
}
# Now, A has matching data. A[0] holds total. A[1] to A[A[0]] holds data.
# Lets read lookup_file, block at a time.
# Since you did not give any specific caracteristics of file2, we can not optimeze in any way.
# Oh well.
while((getline v < lookup_file)>0){
# Throw away head until we reach a valid block header
if(v!~"^Starting of block ") continue;
# We are inside block.
blockid = substr(r,match(r,"[0-9]*$"));
# get whatever data inside block untill we reach end
c=0;
delete B;
B[0]=0;
B[B[0]+=1]=blockid;
while(((getline v < lookup_file)>0)&&v!~"^Ending of block" && c < SAFETY_SINCE_WE_WALK_IN_THE_DARK){
B[B[0]+=1]=v;
if(v~"RID"){
# store it so we can later play with it
B["RID"]=v;
};
c++;# We are fucked as the structure EOB was missing.
}
# we ither died, or end of block.
if(c >= SAFETY_SINCE_WE_WALK_IN_THE_DARK){
we_died = 1;
break;
}
# We assume B has whole block. B[0] has total. B[1] .. B[B[0]] has data. B["RID"] has RID for fast reference.
# Now, since the data format of file2 is not explained at all, I am guessing
# A[n] == "RID=DEADBEEF"
# and
# B["RID"] == "RID=DEADBEEF"
# holds true, which is totally unlikely. what if it is "RID = \t\t\t DeadBeEf"
# so this is really impossible to guess as the OP is not even sure what format they are using.
# sub("^[Rr][Ii][Dd][ \t]*=[ \t]*","",B["RID"])
# or something should be done so we can compare the damn thing.
matched_block = 0; matched_idx = 0;
for(i=1;i<=A[0];i++){
if(A[i]==B["RID"]){matched_idx = i; matched_block=1; break;}
}
if(matched_block){
# This block in B[] also matches A[matched_idx];
# Do what ever you want to do with it.
dbg_printarray(B,"B");
print "A["matched_idx"]=["A[matched_idx]"]";
print "Have fun";
}
}
}'
あなたが達成したいことの明確なイメージがなくても、あなたを助けることができると言わざるを得ません. 次回は、自分が論理を考え出すのに最適な人物だとは思わないでください。一般に、ロジックの作成を専門とする専門家がおり、私たちのほとんどは、自分の問題に合ったものを選択します。問題を解決しようとしても、一からやり直す必要はありません。あなたが持っているもの、そしてあなたが達成したいことを説明してください. おそらく、だれかがすでにそれを行っている可能性があり、ほとんどの場合、フレームワーク全体と、物事を接着するためのダクトテープがあります。