将csh数组传递给awk

时间:2013-09-11 14:42:33

标签: arrays shell awk csh

我正在编写一个我正在编写的csh脚本的问题。

我想做的是读取一个文件,并且对于我正在阅读的这个文件的每一个新行,为我稍后将使用的某个变量分配一个新值。

为了简化我有一个字符串,名为“zn”的数组包含6个值。我可以使用smth打印每个值,如:

echo  ${zn[$i]}   

然后我尝试使用这个数组的值(简单的例子来解释):

cat file1 | awk '{i=NR;n='${zn[i]}';print n,$0}' >! file2

或其他尝试:

cat file1 | awk '{n='${zn[NR]}';print n,$0}' >! file2

好吧,我几乎尝试了括号,撇号,引号的所有可能组合......我总是会遇到一些错误,如:

missing -.

任何帮助都会非常感激,解决方案可能很简单明了。 (对不起,如果我的语法不是最好的,但我对此有点新鲜)

修改 我用bash移植了脚本

...这是我用来准备一些文本文件以在GMT中准备图形的脚本的一部分:

cat crosspdf.dat |
awk '
    BEGIN { n = int(('$dz')/('$dz_new')) }
    {
        z=$1
        for (i=6;i<=NF;i++) {
            if ($i!=0) {
                for(j=1;j<=‌​n;j++)
                    print (i-4)*'$dv', z+(j-n/2)*'$dz_new', $i
            }
        }
    }
' >! temp

这很有效:你唯一需要知道的是$ dz是一个常数值,现在我想改变它,以便为我正在扫描的文件的每一行设置不同的值。我可以轻松地使用值准备数组,但我无法通过在前一行中以某种方式包含它。 PS:感谢支持 - Francesco 2分钟前编辑

编辑2

1)dv和dz_new只是参数 2)dz是一个变量长度只包含数字的数组(深度间隔:smth像-6.0 1.0 5.0 10.0 ... 36.0) 3)crosspdf.dat包含一些类似直方图的数据:每条线对应不同的深度(深度等距,现在不再,所以这就是我需要使用dz数组的原因)

1 个答案:

答案 0 :(得分:1)

让我们从重写脚本开始:

cat crosspdf.dat |
awk '
    BEGIN { n = int(('$dz')/('$dz_new')) }
    {
        z=$1
        for (i=6;i<=NF;i++) {
            if ($i!=0) {
                for(j=1;j<=‌​n;j++)
                    print (i-4)*'$dv', z+(j-n/2)*'$dz_new', $i
            }
        }
    }
'

以正确的方式将shell变量值传递给awk并清理UUOC。以上内容应写为:

awk -v dv="$dv" -v dz="$dz" -v dz_new="$dz_new" '
    BEGIN { n = int(dz/dz_new) }
    {
        z=$1
        for (i=6;i<=NF;i++) {
            if ($i!=0) {
                for(j=1;j<=‌​n;j++)
                    print (i-4)*dv, z+(j-n/2)*dz_new, $i
            }
        }
    }
' crosspdf.dat

现在您需要回答的一些问题是:您希望哪个shell变量(dvdz和/或dz_new)为每行提供不同的值输入文件?这些shell变量的代表值是什么? crosspdf.dat可以包含哪些值?您的预期输出会是什么样的?

更新您的问题,以显示crosspdf.dat的一些小样本,数组变量的一些设置以及所有这些的预期输出。

实际上 - 也许这就是你需要的所有提示:

$ cat file
abc
def
ghi

$ cat tst.sh
dz="12 23 17"
awk -v dz="$dz" '
    BEGIN{ split(dz,dzA) }
    { print dzA[NR], $0 }
' file

$ ./tst.sh
12 abc
23 def
17 ghi

有问题吗?