1

私は動作しているように見えるスクリプトを持っています: 私はファイル「挿入」を持っています

+004.1    
-005.2

ディレクトリ内の各ファイルの検索パターン基準が満たされたときに、これらの値を挿入したいと考えています。以下のスクリプトは実行されます。実際、配列の一部をエコーすると問題ないようです。

例 (以下のスクリプトを参照):

echo ${array1[0]}  prints to +004.2 

しかし、これを awk に挿入したい場合 (以下のスクリプトを参照):

printf( "%s\n",   "       Latitude (N is +)      :  """   '${array1[COUNTER]}' " ", ),

印刷するだけです。4.1これを印刷したいです"+004.1"

どんな助けでも大歓迎です。詳細については、以下のスクリプトを参照してください。

#**********************************************************************
#!/bin/bash
COUNTER=0
array1=( `cat "insert"`)

for i in *.log
do

    echo  ${array1[COUNTER]} 

    cat $i | awk '{ if ( $0 ~ /Letter/ ) {
                      printf( "%s\n",  "       Latitude (N is +)      :  """   '${array1[COUNTER]}' " ", $0 );
                    } else {
                      print $0;
                    }
                  }' > out$COUNTER

    let COUNTER=COUNTER+1

done
4

1 に答える 1

1

printf()などのフォーマットを使用してください%+06.1f

...
printf("%s %+06.1f %s\n", " Latitude (N is +) : ", '${array1[COUNTER]}', $0);
...

SO に対して行が長すぎないように、文字列内のスペースの数を減らしました。

元のコードが使用printf("%s\n", ...one string expression...)し、シェル変数の値が正しくフォーマットされているため、次の方法でもジョブを実行できます。

...
print " Latitude (N is +) : '${array1[COUNTER]}' " $0;
...

これにより、シェルでフォーマットされた文字列が、先頭に付けられ、ロット全体を出力するため$0に使用される文字列に埋め込まれます。print


シェル コードは、 UUOCアワードの対象となります。awkコマンドラインから変数を渡すのも良い考えです:

awk -v latitude=${array1[COUNTER]} \
    '{ if ($0 ~ /Letter/) printf("%s %+06.1f ", " Latitude (N is +) : ", latitude);
       print $0;
     }' $i > out$COUNTER

これはもう少しコンパクトで、読みやすさも劣りません (私の考え方では)。行の開始前に必要に応じて追加情報が出力され、その後、行の残りが無条件に出力されます。示されているように変数を渡すと、スクリプト内の一重引用符を分割する必要がなくなります。

また、効果を得るには、シバン行#!/bin/bashがファイルの最初の行である必要があることに注意してください。すべての星を含むボックスのコメント行は、実際にはあまり役に立ちません。私はそれを削除します (彼ら — 私はすでに末尾のものを削除しましたが、この問題を議論できるようにするために先頭のものをそのままにしておく必要がありました)。

于 2012-09-21T00:17:52.957 に答える