AWK从数组中提取长度较短的字符串

时间:2015-12-28 19:59:31

标签: unix awk gawk

我有一个包含诸如“gummy”,“owl”,“table”等字样的数组......我需要的是提取较短的单词并将其指定给变量。

我尝试了什么

st[$1] = x;
for (i in st)
{
    if(min < st[i])
    {
        min = st[i];
    }
}
ld=min;

5 个答案:

答案 0 :(得分:1)

因此,只需找到最短的长度,请考虑以下事项:

$ ./bar.awk
shortest= -1   i= 1    st[i]= gummy
first time, now shortest= 5
shortest= 5   i= 2    st[i]= owl
found shorter value, now shortest= 3
shortest= 3   i= 3    st[i]= table
shortest= 3   i= 4    st[i]= cat
done. shortest= 3

$ cat bar.awk
#!/usr/bin/awk -f

BEGIN {
   st[1]="gummy"
   st[2]="owl"
   st[3]="table"
   st[4]="cat"

   shortest = -1
   for (i in st)
   {
       print "shortest=", shortest, "  i=", i, "   st[i]=", st[i]
       if( shortest == -1 ) {
          shortest = length( st[i] )
          print "first time, now shortest=", shortest
       } else if( length( st[i] ) < shortest ) {
          shortest = length( st[i] )
          print "found shorter value, now shortest=", shortest
       }
   }
   print "done. shortest=", shortest
}

原帖: 这是一个简短的例子,它应该让你开始。

我想调用打印东西来看看代码在做什么。如果您不确定为什么某些内容以特定方式工作,请在其周围添加打印件以显示所涉及的值,直到您理解为止。打印不需要花哨或任何东西,只需足以让您了解不同的表达式在任何时间点正在做什么给定的变量。

注1:我们从候选人开始作为我们数组中的一个元素。这有点多余,因为循环会做一个不必要的比较,但很容易用这种方式写,清楚发生了什么,我们避免了可能的错误(如果你初始化候选人=&#34;&#34;并且你的数组没有任何空字符串值?)

注意2:我将st [i]分配给变量&#39;值&#39;因为我认为更清楚地说明st [i]无处不在(无论哪种方式都很好)。

$ chmod +x foo.awk
$ cat foo.awk
#!/usr/bin/awk -f

BEGIN {
   st[1]="gummy"
   st[2]="owl"
   st[3]="table"
   st[4]="cat"

   candidate=st[1]
   for (i in st)
   {
       print "candidate=", candidate
       print "        i=", i
       print "    st[i]=", st[i]
       value = st[i]
       if( length( value ) < length(candidate) )
       {
           candidate = value
           print "found shorter value, changing candidate=", candidate
       }
   }
   print "done. candidate=", candidate
}

$ ./foo.awk 
candidate= gummy
        i= 1
    st[i]= gummy
candidate= gummy
        i= 2
    st[i]= owl
found shorter value, changing candidate= owl
candidate= owl
        i= 3
    st[i]= table
candidate= owl
        i= 4
    st[i]= cat
done. candidate= owl

问题:假设你有两个(或更多)候选人都同样短,比如&#34; cat&#34;和&#34;猫头鹰&#34;在上面的例子中。您想要生产哪些价值?你能想出一种产生所有最短值的方法吗?

答案 1 :(得分:1)

此脚本已经过几个awks(包括GNU awk和mawk)的测试,将所需的功能抽象为awk函数。

// Resize Bitmap function to Handle all the Images from resources the right size
public Bitmap getResizedBitmap(Bitmap bm, float newWidth, int newHeight) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = newWidth / width;
    float scaleHeight = ((float) newHeight) / height;
    // CREATE A MATRIX FOR THE MANIPULATION
    Matrix matrix = new Matrix();
    // RESIZE THE BIT MAP
    matrix.postScale(scaleWidth, scaleHeight);

    // "RECREATE" THE NEW BITMAP
    Bitmap resizedBitmap = Bitmap.createBitmap(
            bm, 0, 0, width, height, matrix, false);
    bm.recycle();
    return resizedBitmap;
}

答案 2 :(得分:1)

使用bash内置的替代解决方案。

$ a=(gummy owl table) 
$ for i in ${a[@]}; do echo ${#i} $i; done | sort -n | head -1 | cut -d' ' -f2

owl

答案 3 :(得分:1)

$ cat tst.awk
BEGIN {
    array["gummy"]
    array["owl"]
    array["table"]

    for (word in array) {
        cur = length(word)
        if ( (min == 0) || (cur < min) ) {
            shortest = word
            min = cur
        }
    }

    print shortest
}

$ awk -f tst.awk
owl

答案 4 :(得分:0)

我想你忘了调用length函数:

awk '
BEGIN {
  st[1] = "gummy"
  st[2] = "owl"
  st[3] = "table"

  for (i in st)
  {
    if (min == "" || length (st[i]) < length (min))
    {
      min = st[i]
    }
  }

  print min

}
'

结果:

owl