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。@先生,是的。谢谢您的逻辑