0

私が書いている csh スクリプトに問題があります。

私がしたいのは、ファイルを読み取り、読み取り中のこのファイルの新しい行ごとに、後で使用する特定の変数に新しい値を割り当てることです。

簡単にするために、6つの値を含む「zn」という文字列配列があります。次のような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: サポートに感謝します – フランチェスコ 2 分前 編集

編集2

1) dv と dz_new は単なるパラメーターです 2) dz は、数値だけを含む可変長の配列になります (深さの間隔: -6.0 1.0 5.0 10.0 ... 36.0 のような smth) 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
            }
        }
    }
'

シェル変数値を正しい方法で 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

入力ファイルの各行に異なる値を設定したいシェル変数 ( dvdz、および/または) はどれですか? dz_newこれらのシェル変数の代表的な値は何ですか? どのような値を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 に答える