Awk 搜索图案并打印计数

Awk 搜索图案并打印计数,awk,sed,Awk,Sed,我有如下输入表 module input output type func AOIO A1,A2,B Z comb ((!A1+!A2) B) AN2 A1,A2 ZN comb (A1 A2) AIO A1,A2,A3 Z comb ((A1 A2)+A3) NOR

我有如下输入表

module      input        output    type           func
AOIO        A1,A2,B       Z         comb        ((!A1+!A2) B)
AN2         A1,A2         ZN        comb        (A1 A2)
AIO         A1,A2,A3      Z          comb       ((A1 A2)+A3)
NOR         A1,A2 ,B       Z        comb       (!((A1 A2)+B))
BUF         I             Q          seq         I
CLK         I             QN         seq        IN
BND     
INV         IN            Z           comb      (!I)      
我希望上面的表格以下面的格式显示

module      input        output    type           func                 path
AOIO        A1,A2,B       Z         comb        ((!A1+!A2) B)           3
AN2         A1,A2         ZN        comb        (A1 A2)                 1
AIO         A1,A2,A3      Z          comb       ((A1 A2)+A3)            2
NOR         A1,A2 ,B       Z        comb       (!((A1 A2)+B))           3
BUF         I             Q          seq         I                      1
CLK         I             QN         seq        IN                      1
BND                                                                     0
INV         IN            Z           comb      (!I)                    1
获取路径的逻辑是

计算开始括号“(”

如果
结尾,则将路径分配为
计数+1
,与AO情况相同。 如果它没有
则将路径指定为计数,即只有开口括号的编号(AN,AI大小写)。如果它没有开口括号,则将路径指定为1(BUF,CLK大小写)。如果它没有func,则将路径指定为0(BND大小写)。如果开口括号之间存在
(然后忽略
并计算开口括号的数量并将其分配给路径(与NOR情况相同)。并且每当func中存在
(!I)
时,始终将路径分配为1

有谁能帮我建立这方面的逻辑吗。 我可以(使用下面的代码)计数,并获得(的编号)的值,然后可以使用

sed 's/[^(]//g'  file  | awk '{ print length}  |  awk '{ if ($2~/^(*!/ ) print $3 length+1 ; elseif($2~/^( / ) print $3 length; elseif ($2 !~ /(/ print $3 "1"; elseif ($2~/(!I)/ ) print $3 "1"
但在代码中,我没有得到“(”的计数和错误。 我不明白逻辑,如果“!”介于两者之间,我如何计算开始括号。

编辑:添加解决方案,因为OP的样本已更改

awk '
FNR==1{
  OFS="\t"
  print $0,"path"
  next
}
{
  line=$0
  if($0~/!I/){
     print $0,1
     next
  }
  sub(/[^(]*/,"")
  sub(/[a-zA-Z0-9].*/,"")
  if($0~/!$/){
     print line,length($0)
  }
  else if(!NF){
     print line,length($0)+1
  }
  else if($0 ~ /!/ && $0 !~ /!$/){
     print line,length($0)-1
  }
  else{
     print line,length($0)
  }
}' Input_file | column  -t -s $'\t'
输出如下

module      input        output    type           func         path
AOIO        A1,A2,B       Z         comb        ((!A1+!A2) B)  3
AN2         A1,A2         ZN        comb        (A1 A2)        1
AIO         A1,A2,A3      Z          comb       ((A1 A2)+A3)   2
NOR         A1,A2 ,B       Z        comb       (!((A1 A2)+B))  3
BUF         I             Q          seq         I             1
CLK         I             QN         seq        IN             1
BND                                                            1
INV         IN            Z           comb      (!I)           1
module     func            path
AO         ((!A1+!A2) B)   3
AN         (A1 A2)         1
AI         ((A1 A2)+A3)    2
NOR        (!((A1 A2)+B))  3
BUF         I              1
CLK         IQ             1
BND                        0
INV        (!I)            1


基于仅在GNU
awk
中显示的示例,您可以尝试以下内容吗

awk '
FNR==1{
  OFS="\t"
  print $0,"path"
  next
}
{
  line=$0
  if($0~/!I/){
     print $0,1
     next
  }
  $1=""
  sub(/[^\t]*\t+/,"")
  sub(/[a-zA-Z0-9].*/,"")
  if($0~/!$/){
     print line,length($0)
  }
  else if(!NF){
     print line,length($0)+1
  }
  else if($0 ~ /!/ && $0 !~ /!$/){
     print line,length($0)-1
  }
  else{
     print line,length($0)
  }
}' Input_file | column  -t -s $'\t'
输出如下

module      input        output    type           func         path
AOIO        A1,A2,B       Z         comb        ((!A1+!A2) B)  3
AN2         A1,A2         ZN        comb        (A1 A2)        1
AIO         A1,A2,A3      Z          comb       ((A1 A2)+A3)   2
NOR         A1,A2 ,B       Z        comb       (!((A1 A2)+B))  3
BUF         I             Q          seq         I             1
CLK         I             QN         seq        IN             1
BND                                                            1
INV         IN            Z           comb      (!I)           1
module     func            path
AO         ((!A1+!A2) B)   3
AN         (A1 A2)         1
AI         ((A1 A2)+A3)    2
NOR        (!((A1 A2)+B))  3
BUF         I              1
CLK         IQ             1
BND                        0
INV        (!I)            1
说明:添加上述内容的详细说明

awk '                                   ##Starting awk program from here.
FNR==1{                                 ##Checking condition if this is first line then do following.
  OFS="\t"                              ##Setting OFS as tab here.
  print $0,"path"                       ##Printing current line and path string here.
  next                                  ##next will skip all further statements from here.
}
{
  line=$0                               ##Setting variable line to current line.
  if($0~/!I/){                          ##Checking condition if line is equal to !I then do following.
     print $0,1                         ##Printing current line and 1 here.
     next                               ##next will skip all further statements from here.
  }
  $1=""                                 ##nullifying first field here.
  sub(/[^\t]*\t+/,"")                   ##Substituting everything till tab and tab occurrences with NULL here.
  sub(/[a-zA-Z0-9].*/,"")               ##Substituting everything till last in current line.
  if($0~/!$/){                          ##Checking if line do not end with ! then do following.
     print line,length($0)              ##Printing line and length of current line.
  }
  else if(!NF){                         ##else if number of fields is NULL then do following.
     print line,length($0)+1            ##Printing line and length of current line +1 here.
  }
  else if($0 ~ /!/ && $0 !~ /!$/){      ##else if line is NOT equal to ! AND not ending with !
     print line,length($0)-1            ##Printing line and length of current line-1 here.
  }
  else{                                 ##else do following.
     print line,length($0)              ##Printing line and length of current line.
  }
}' Input_file | column  -t -s $'\t'     ##Passing awk output to column command to separate it tab wise.

您也可以尝试此awk:

cat cpath.awk
开始{
FS=“{3,}”
}
NR==1{
printf“%-30s%s\n”$0,“路径”
下一个
}
{
n=0
如果($2~/!I |^[^(+]+$/)
n=1
else if(匹配($2,/^\(+![^(]/))
n=r长度-1
else if(匹配($2,/^\([!(]*/)){
s=substr($2,1,RLENGTH)
n=gsub(/!$\(/,“”,s)
}
printf“%-30s%s\n”,$0,n
}
然后将其命名为:

awk -f cpath.awk file

请在您的问题中以代码的形式添加您的努力,然后让我们知道。您是否可以让我们知道计数如何在第一行变为
3
,在第二行变为
2
?因为您的问题不清楚。如果以开始(并以!结束),那么我们将得到括号的编号(“+”1“+”1表示“!”在结尾处(((!将变成
5
),我们得到的路径是+1的编号,即2+1=3。在第二秒内它是从(只有一个括号)开始的,所以我们得到的是1。这意味着
((!
将变成
5
,然后
将变成6?请确认一下?@raindersingh13,是
((((!
变为
5
((
变为
6
)但如果“!”位于开口括号之间,如
((
),则我们不会添加1,jst计算开口括号的数量。因此对于此
()(((
它将变成
4
,这只是开始括号中的编号。如果在我的模块和func之间还有3个列存在修改问题,那么上面的代码将通过将
$1
更改为
$5
来工作jst。因为我在每个地方都得到
1
。@NEHACHOUDHARY,对于您给定的示例,它对我有效好的,如果这里有任何疑问,请务必告诉我。@NEHACHOUDHARY,是的,请查看您当前的示例,您可以将其更改为
$5
,然后它应该会飞起来。@NEHACHOUDHARY,请检查“sub(/[^(]*/,”)`。@NEHACHOUDHARY,请您不要继续更改您的问题(从一开始),不鼓励这样做,因为它会让用户感到困惑,你最好在这里看到答案,用你的努力来回答一个新问题,干杯。它起作用了。但是假设我有类似于
((a1a2)+(B1)+C)的函数
此处路径值应为
3
,因为有3个左括号。但使用上述代码,其给出的
4
作为其计算的
B1
左括号。那么如何修改上述代码。是的worked@anubhava.代码中会有轻微的修改,然后会显示路径列我已经完成了对齐。谢谢,上面的代码运行得很好,但是当涉及到
(!(!A1!A2))
这里它的
不计算A1的!数
(我们需要先计算jst
即A1的,而不是A2的),并给出路径为2,但路径应该是3。@先生,是的。谢谢您的逻辑