我使用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
答案 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
来运行此脚本。它为我产生了预期的结果。
我不确定您的输入行会有多么多样,但我认为使用substr
和gsub
可能有点过分。您可以使用以下行获得相同的结果:
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