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

シェルスクリプトのループで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

仕組みは次のとおりです。提案されているようにshe-bangを試しましたが、エラーが繰り返されました。

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

答え1

私はエラーがあなたのコマンドにAwk関連していないと思います。 forループ構成がサポートされていないshPOSIX bourneシェルでこれを実行していると思います。((

bashスクリプトを実行し、shebangをインストールパスに設定します。#!/usr/bin/env bash検索は常に可能なわけではないので、通常これを行うのは安全です。#!/usr/bin/env特にLinux以外のシステムではさらにそうです。 OpenBSDシステムの場合。PATHbashbash/bin/usr/local/bin

答え2

スクリプトは/bin/shbashまたはksh93Cに似たループを理解する他のシェル)によってfor解釈される可能性が高いです。

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

#!/bin/bash

ファイルの一番上(使用するシェルとパスに変更)または正しいインタプリタを使用してスクリプトを明示的に実行します。例:

bash ./scriptname

答え3

3つのパラメータループ制御表現存在する強く打つ次のように指定する必要があります。

for (( EXP1; EXP2; EXP3 ))

ただし、単純な場合は次のようにします。

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

答え4

完全性を期すために、ksh93-syntaxコマンドに対応するPOSIXは次のとおりです(したがって、shあなたを含むすべての最新のashシェルdashまたはbusyboxベースの実装で動作します)。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"

関連情報