【问题标题】:How do we make arrays in awk?我们如何在 awk 中创建数组?
【发布时间】:2019-05-06 05:20:28
【问题描述】:
{
    k = 0
    x = 0
    fracon = (10/2)+1
    {
        for (j = 1; j <= 1100 ; j++)
        {
            if (j <= fracon)
                scal[j]= j-x

            else
                k= k + 1
            scal[j]= j - (2*k)
            {
                if (scal[j] == 1)
                    fracon= fracon+11
                {
                    if (j % 11 == 0)
                        x=x+11
                    k=k+0.5
                }
            }
        }
    }
}

就是这样。我使用上面的代码生成了以下数组。它在 Matlab 中有效,但在 awk 中无效。

array= [1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6]

【问题讨论】:

  • 不清楚,为什么要生成一个带有awk 的数组,请告诉我们更明确的要求吗?
  • 不清楚这些块的开始或结束位置。你能用文字或数学公式来描述算法吗?
  • 我要生成这个数组 = [1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6] 等等。
  • 我已经修正了你的缩进。至少有一个不需要的块(从第 5 行开始的那个)。

标签: arrays awk


【解决方案1】:

这是生成相同序列的另一种方法

$ awk 'BEGIN{for(i=0;i<=20;i++) {k=i%11+1; printf "%s ", (k<7?k:12-k)}; print ""}'

1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 

不确定你想要的是否只是在 11 个元素循环中重复;基于有限的样本很难说。

或者没有awk

$  yes $({ seq 6; seq 5 -1 1; } | paste -sd' ') | head -100 | paste -sd' '

1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 ...

带方括号

$ awk 'BEGIN{printf "["; 
             for(i=0;i<=1100;i++) {k=i%11+1; printf "%s ", (k<7?k:12-k)}; 
             printf "]\n"}'

[1 2 3 4 5 6 5 4 3 2 1 1 2 3 4 5 6 ... 5 4 3 2 1 ]

将这些值填充到一个大数组中并不是最优的,您可以编写一个函数来轻松返回索引值

$ awk 'function k(i,_i) {_i=i%11+1; return _i<7?_i:12-_i}  
       BEGIN{for(i=0;i<=25;i++) print k(i)}'

在实际代码中,您将使用k(i) 而不是打印。注意数组索引从 0 开始。

注意_iawk 函数中的局部变量;你不需要在调用语法中使用。

【讨论】:

  • 谢谢,您的代码运行良好。如何打印成数组?
  • 只需添加方括号。
  • like : $ awk 'BEGIN{for(i=0;i
  • 还有你所说的“数组”是什么意思,只是以这种格式打印,还是你打算在awk 中将它用于其他目的?
  • 好的,只是为了确保,这个脚本只是打印数组格式的值。它不是一个数组(绝对不是bash 预期的自动转换格式)。如果消费在awk,则无需创建数组,只需创建一个函数,该函数将返回给定索引的相应值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多