0

我正在编写的 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 like -6.0 1.0 5.0 10.0 ... 36.0) 3) crosspdf.dat 包含一些类似直方图的数据:每条线对应不同的深度(深度等距,现在不再,所以我需要使用 dz 数组)

4

1 回答 1

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 变量( 、 和/或 )具有不同的dvdzdz_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

问题?

于 2013-09-12T12:37:40.267 回答