web-dev-qa-db-ja.com

シェルスクリプトのループでawkを実行しようとすると、「構文エラー:ループ変数に問題があります」

端末でうまく動作するawkコマンドがあります。このawkコマンドは、列ヘッダーに応じて異なるファイルを作成します。 awkコマンド:

for((i=2;i<5;i++)); do 
    awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i > n".txt"}' ${Batch}.result.txt
done

同じコマンドをシェルスクリプトに組み込むと、エラーが表示されます。

Syntax error: Bad for loop variable

次のように動作しました。提案されているとおり、シーバンで試しましたが、エラーが繰り返されました。

for i in 2 3 4; do awk -v i=$i 'BEGIN{OFS=FS="\t"}NR==1{n=$i}{print $1,$i  n".txt"}'
4
user258795

エラーはAwkコマンドとは関係ないと思います。 ((を使用したforループ構成がサポートされていないPOSIXボーンシェルshで実行していると思います。

bashがインストールされているパスにShebangを設定してスクリプトを実行します。 #!/usr/bin/env bashPATHbashを検索し、bashは常に#!/usr/bin/envにあるとは限らないため、通常、/binを実行しても安全です。 Linux以外のシステム。 OpenBSDシステムでは、/usr/local/binにあります。

11
Inian

スクリプトはbash(または/bin/shまたはCのようなfor- loopを理解するその他のシェル)ではなくksh93によって解釈されている可能性があります。

スクリプトに#!の行があることを確認してください

#!/bin/bash

ファイルの最上部(使用するシェルとパスに変更)、または適切なインタープリターを使用してスクリプトを明示的に実行します。次に例を示します。

bash ./scriptname
7
Kusalananda

A3パラメータループ制御式in bashは次のように指定する必要があります:

for (( EXP1; EXP2; EXP3 ))

しかし、あなたの単純なケースでは、私は単に使用します:

for i in {2..4}; do ...
2
RomanPerekhrest

完全を期すために、ksh93-syntaxコマンドと同等のPOSIX(つまり、shまたはbusybox ashのようなdashベースのシェルを含むashの最新の実装で機能します)は次のようになります。

i=2; while [ "$i" -lt 5 ]; do
  awk -v i="$i" '
    BEGIN{OFS=FS="\t"}
    NR==1{n=$i}
    {print $1,$i > n".txt"}' < "${Batch}.result.txt"
  i=$((i + 1))
done

ここでは、それを書くほうが理にかなっています:

awk -F '\t' -v OFS='\t' '
  NR == 1 {for (i = 2; i < 5; i++) file[i] = $i".txt"}
  {for (i = 2; i < 5; i++) print $1,$i > file[i]}' < "${Batch}.result.txt"
0