我有如下的输入表
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
获取路径的逻辑是
数开括号'(‘)。
如果(
以!
结尾,那么将路径赋值为count+1
,就像AO的情况一样。如果它没有!
,那么将路径赋值为计数,即只有no.of开括号(a,AI情况)。如果它没有开始括号,指定路径为1 (BUF,CLK大小写)。如果它没有func,那么将路径赋值为0(BND大小写)。如果!
在开括号之间,(
,则忽略!
并计算开括号的数目,并将其分配给path (在NOR情况下)。每当函数中存在(!I)
时,将路径赋值为1始终。
有人能帮我建立这方面的逻辑吗。我可以计数(使用下面的代码并获得no的值)。(然后可以使用以下方法检查上述条件:
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"
但是在这里,在代码中,我没有得到“(”和得到错误)的计数。我不懂逻辑,如果'!‘,我怎么能数开括号呢?介于两者之间。
发布于 2020-11-03 14:57:23
你也可以试试这个awk:
cat cpath.awk
BEGIN {
FS = " {3,}"
}
NR == 1 {
printf "%-30s %s\n", $0, "path"
next
}
{
n = 0
if ($2 ~ /!I|^[^(]+$/)
n = 1
else if (match($2, /^\(+![^(]/))
n = RLENGTH -1
else if (match($2, /^\([!(]*/)) {
s = substr($2, 1, RLENGTH)
n = gsub(/!$|\(/, "", s)
}
printf "%-30s %s\n", $0, n
}
然后将其降为:
awk -f cpath.awk file
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
发布于 2020-11-03 14:10:27
编辑:添加解决方案,因为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
请您试一试,基于您所显示的示例仅在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 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.
https://stackoverflow.com/questions/64662412
复制相似问题