Awk 当条件为true时,从另一个文件添加行

Awk 当条件为true时,从另一个文件添加行,awk,Awk,继续链接中的问题 我有另一个包含数据的文件2 cell input out type fun level CLK C Z seq Cq 1 DFk C,Cp Q seq IQ 1 DFR D,C Qn seq IN 1 SKN SE,Q Qp seq Iq 1 下面的代码是将级别总和设为7并打印行 awk ' function rnd(max) {

继续链接中的问题

我有另一个包含数据的文件2

cell   input  out  type   fun  level
CLK    C       Z    seq   Cq   1      
DFk    C,Cp    Q    seq   IQ   1
DFR    D,C     Qn   seq   IN   1
SKN    SE,Q    Qp   seq   Iq   1
下面的代码是将级别总和设为7并打印行

awk '
function rnd(max) {        
   return int(rand()*max-1)+2
}
BEGIN {
   srand()                
}
NR == 1 {                  
   print                   
   next
}
{
   rec[NR] = $0           
   num[NR] = $NF           
}
END {
   while(1) {             
      r = rnd(NR)          
      if (!seen[r]++)      
         s += num[r]      

      if (s == 7)         
         break
      else if (s > 7) {   
         delete seen
         s = 0
         continue
      }
   }
   for (j in seen)         
      print rec[j]
} ' file1
上面的代码每次执行时只打印一组输出(levelsum7 true)

但现在我想打印两组数据,当我执行代码一次时,结果是levelsum为7,每当levelsum=7为真时,我想在新行中插入file2到它的行

产出导致

cell   input     out    type      fun            level
AI20   A1,A2      Z     comb    ((A1A2))           2
INV    I1         ZN    comb    (!I1)              1  
BUF  A1,A2,A3,B1  Z     comb    (!(((A1A2)A3)B1))  4
CLK    C          Z     seq      Cq                1
XOR    A1,A2,B1   Z     comb    (((A1A2)B1)        3
IAD    A1,A2,A3   Z     comb    (!((A1A2)A3))      3
INV    I1         ZN    comb    (!I1)              1
在这里的输出中,我们可以看到当file1的级别总和为7时,从file2插入了
CLK C Z seq Cq 1

为了得到这个输出,我修改了上面的代码

awk '
function rnd(max) {        
   return int(rand()*max-1)+2
}
BEGIN {
   srand()                
}
NR == 1 {                  
   print                   
   next
}
{
   rec[NR] = $0           
   num[NR] = $NF           
}
END {
   for (( i=1; i<3;i++)) 
     do  
         
      r = rnd(NR)          
      if (!seen[r]++)      
         s += num[r]      

      if (s == 7)         
         for line in $file2
           do
             awk '{ $0 }'
           done
     done

      else if (s > 7) {   
         delete seen
         s = 0
         continue
      }
   
   for (j in seen)         
      print rec[j]
} ' file1
awk'
函数rnd(max){
返回int(rand()*max-1)+2
}
开始{
srand()
}
NR==1{
印刷品
下一个
}
{
记录[编号]=$0
num[NR]=$NF
}
结束{
对于((i=1;i=7){
删除所见
s=0
持续
}
for(见中的j)
打印记录[j]
}'文件1

但我在打印文件2中的行时出错。

您可以使用此增强的awk脚本:

cat rnd.awk
函数rnd(max){#生成一个介于2和max之间的randon数
返回int(rand()*max-1)+2
}
函数rndsum(){
而(1){#无限循环
r=rnd(NR)#生成一个介于2和NR之间的随机数
如果(!seen[r]++)#使用此随机数填充seen数组
s+=num[r]#从num数组中获取聚合和
如果(s==sum)#如果是sum,则打破循环
打破
否则,如果(s>sum){#如果s>sum,则重新启动循环
删除所见
s=0
持续
}
}
对于(SEN中的j)#对于SEN打印记录数组中的每个val
打印记录[j]
删除所见
s=0
}
开始{
srand()#种子随机生成
}
对于标题行,NR==1{#
打印#打印标题记录
下一个
}
FNR==NR{#处理文件1时
rec[NR]=$0#将每条记录保存在rec数组中,并将NR作为键
num[NR]=$NF#使用NR作为键保存num数组中的最后一列
下一个
}
FNR>1{
rec2[++n]=文件2中的$0#记录保存在rec2中
}
结束{
rc=rc>n?n:rc#允许rc为文件2中的最大行数

对于(i=1;iSo),在预期的输出中有7行数据?是这样的:file1中的3行(sum=7)+file2中的1行+files中的3行(sum=7)?是..当然。但不是计算文件1中的3行,它应该包含文件1中的行,这会导致sum=7,因此行数可以是任何取决于级别的行数。由于我需要文件1中的两组输出,这就是为什么上述代码的格式为文件1中的3行(sum=7)+文件中的1行+文件中的3行(sum=7)好的,我理解这一部分,但是应该从文件2中选择哪一条记录?当我们从文件2中得到sum as 7时,从文件2中打印一行。假设我希望在一次执行中得到3组数据,得到sum 7。然后我将从文件中得到
行1 sum=7+从文件中得到第一行2+从文件中得到行1 sum=7+从文件中得到第二行2+从文件中得到行1 sum=7
输出..在第一个输出中,
awk-v rc=2-f
rc=2显示文件2中的两行。但在第二个输出中,rc=2也显示文件2中的一行??先生,我可以让它更具交互性,即用户定义的。这样用户就可以为sum s和rc提供输入值吗?我尝试使用
read-p“输入sum:”sum
并将sum require替换为
s==$sum
。与
rc
类似,即
awk-v rc=$number-f rnd.awk file1 file2
但这不起作用。请检查我的更新答案。您可以将其称为:
awk-v sum=$sum-v rc=$rc-f rnd.awk file1 file2 | column-t
是的,先生,它起作用了。先生,我有一个不同的疑问nt问题,我已经发布了“引用字段并将逻辑分配给该字段”你能帮我一下吗。@anubhava