我需要一些有关以下内容的建议 我写了一个脚本,这是下面的算法
Step 1: Get the RID's from file 1 and store that in "temp1"
Step 2: With the help of "temp1" get the corresponding blocks from file 2 and accumulate it
Step 3: With the help of the accumulated block, get the counts of each of the fields
代码
Step 1: zgrep -i XXXX **FILE 1**|grep -o "RID=[0-9|A-Z]*"|uniq|cut -d "=" -f2 > **TEMP 1**
Step 2 : awk 'while (getline < **TEMP 1**){requestArray[$0]++;} close(**TEMP 1**); GET BLOCKS >> **TEMP 2**} **FILE 2**(CODE is trimmed)
很长一段时间后
Step 3: GET=( $(awk 'Get the necessary fields from temp 2' **TEMP 2**) )`
我面临的问题
我面临的问题是由于输入输出操作导致程序运行缓慢。正如您在步骤1中看到的,我在步骤1中生成临时文件TEMP 1,在步骤2中多次附加 TEMP 2文件,因此由于这个巨大的IO操作,我的程序很慢
解 解决方法是将temp 1和temp 2设为内存变量
需要建议 要将Temp 1作为内存,我需要知道如何从终端读取输出并将其存储在数组中 ..你能不能告诉我如何做到这一点。
与此类似,我需要将在temp 2中获得的输出存储为数组......
你可以帮我解决这个问题。谢谢。
SAMPLE DATA
**TEMP 1**
RID 1= 472349723478923489
RID 2= 672349723478923489
RID 3= 772349723478923489
RID 4= 872349723478923489
RID 5= 972349723478923489
RID 6= 372349723478923489
**FILE 1**
asjdghasdh23712893712983712893qwsdhaksdhask **RID 1= 472349723478923489**
**FILE 2**
Starting of block 1
time
date
hour
parameter 1
parameter 2
parameter 3
RID 1= 472349723478923489
parameter 3
parameter 4
parameter 5
Ending of block 1
Starting of block 2
time
date
hour
parameter 1
parameter 2
parameter 3
RID 57= 3423423423423234
parameter 3
parameter 4
parameter 5
Ending of block 2
Starting of block 3
time
date
hour
parameter 1
parameter 2
parameter 3
RID 3= 772349723478923489
parameter 3
parameter 4
parameter 5
Ending of block 3
TEMP 2
block 1 and block 3 from file 2 as in block 2 RID is 57 which is not present in temp 1. So this will not be contained here
答案 0 :(得分:0)
这可能对您有用:
awk 'NR==FNR{requestArray[$0];next};$0 in requestArray{print "Found"}' TEMP1 FILE2
说明:
在开始时读取TEMP1
一次并存储在数组中。 NR
和FNR
是awk
使用的变量。每次读取记录时它们都会递增,除非在更改文件时重置FNR
。
另一种方法是使用BEGIN
块,请参阅here
答案 1 :(得分:0)
现在,因为你想从鼻子里吃意大利面而没有痛苦,我们会读你的想法 猜猜你想做什么。我们有两个选择,一个是将意大利面条磨成液体,另外两个,打开你的 嘴。
话虽如此,我的猜测可能 file1是某种结构化数据,它包含一个名为RID的键值对。 我不知道它是什么,或它是做什么,或代表什么,但在线之间阅读, file2有一个相应的条目。
现在,file2也以某种方式构建,看起来有一些键值对分组 进入某种形式的结构化块,并且有多个块。
现在,问题是,我们的目标是什么样的最终结果? 读_between_the_lines_,我猜你想要整个块,当一个键值对 块,RID键,匹配某个条件。这是对的吗?
那究竟是什么情况呢? 我的猜测是你想做一些事情 当FILE1中存在BLOCK的RID时,从FILE2中选择WHOLE_BLOCK
然后我们有两个选择。 假设你的file2小于9000PetaBytes,并且条目数也少于那个 IEEE 52 bit 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";
}
}
}'
我必须说,如果没有一个清晰的图片表明你想要实现的目标,那么就能够帮助你。 下一次,不要认为你是最好的人提出一个逻辑。 总的来说,有一些专门用于创造逻辑的经验,而我们大多数人, 选择适合我们的问题。试图解决问题并不意味着你必须重新发明轮子。 只要描述你拥有的东西,以及你想要实现的目标。有可能,有人已经做到了, 而且很可能有一个完整的框架和胶带来粘合东西。