如果条件行为异常进行条件检查,则使用awk

时间:2014-05-19 09:16:19

标签: awk

我使用awk在cshel工作。我遇到的问题是它没有返回预期的输出,如果条件在某些时候表现不好但是在其他时间表现良好,则需要了解

echo "m='12*mfactor'" | awk '{a="";a2=""; for(i=1;i<=NF;i++) {if($i~/mfactor/) {a=substr($i,3,3); gsub("*", "",a); gsub("\047", "",a); }}; for(i=1;i<=NF;i++) {if($i~/mfactor/&&a~/^[0-9]/&&a>1) {gsub("m=\047","m=\047"a1,$i); for(a2=1;a2<=a;a2++) {print a2","a};if(a2>a) {print a2" is greater than "a};}};  }'

它返回

1,12- 2大于12

echo "m='4*mfactor'" | awk '{a="";a2=""; for(i=1;i<=NF;i++) {if($i~/mfactor/) {a=substr($i,3,3); gsub("*", "",a); gsub("\047", "",a); }}; for(i=1;i<=NF;i++) {if($i~/mfactor/&&a~/^[0-9]/&&a>1) {gsub("m=\047","m=\047"a1,$i); for(a2=1;a2<=a;a2++) {print a2","a};if(a2>a) {print a2" is greater than "a};}};  }'

它返回

1,4 2,4 3,4 4,4 5大于4

1 个答案:

答案 0 :(得分:2)

当您想要进行数字比较时,您遇到的问题是您正在进行字符串比较a2<=a。 2大于1,因此“2”大于“12”。

我相信以下是您想要的。我把它放入一个脚本中,因此它更具可读性。关键区别在于使用unary plus operator a = +a,将a转换为数字。

#!/usr/bin/awk -f

{
# no need to initialise a and a2 here
# combine the loops
    for(i=1;i<=NF;i++) {
        if($i~/mfactor/) {
# combine two gsubs - see below for potentially better alternative
            a=substr($i,3,3)
# instead of \047 use '\''
            gsub("[*'\'']", "",a)
            if(a~/^[0-9]/&&a>1) {
# a1 isn't initialised, what you were trying to do here?
# gsub("m=\047","m=\047"a1,$i)
# convert a to a number using unary plus
                a = +a              
                for(a2=1;a2<=a;a2++) {
                    print a2","a
                }
# no need for "if" as the loop has already ended
                print a2" is greater than "a
            }
        }
    }
}

可以通过使其可执行并运行echo "m='12*mfactor'" | ./factor.awk来运行此脚本。它为我产生了预期的结果。


更新

我不确定您的输入行会有多么多样,但我认为使用substrgsub可能有点过分。您可以使用以下行获得相同的结果:

split($i, b, /[*\047]/)
a = +b[2]

您可以在一系列字符上使用正则表达式split,这是从字符串中获取数字部分的一个选项。

测试出来:

echo "m='4*mfactor'" | awk '
{ 
    for(i=1;i<=NF;i++) { 
        if($i~/mfactor/) { 
            split($i, b, /[*'\'']/); a = +b[2]
            if(a~/^[0-9]/&&a>1) { 
                for(a2=1;a2<=a;a2++) { print a2","a } 
                print a2" is greater than "a 
            } 
        } 
    } 
}'
1,4
2,4
3,4
4,4
5 is greater than 4
echo "m='12*mfactor'" | awk '
{ 
    for(i=1;i<=NF;i++) { 
        if($i~/mfactor/) { 
            split($i, b, /[*'\'']/); a = +b[2]
            if(a~/^[0-9]/&&a>1) { 
                for(a2=1;a2<=a;a2++) { print a2","a } 
                print a2" is greater than "a 
            } 
        } 
    } 
}'
1,12
2,12
3,12
4,12
5,12
6,12
7,12
8,12
9,12
10,12
11,12
12,12
13 is greater than 12