Awk 当条件为true时,从另一个文件添加行
继续链接中的问题 我有另一个包含数据的文件2Awk 当条件为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) {
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