端末でうまく動作する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"}'
エラーはAwk
コマンドとは関係ないと思います。 ((
を使用したforループ構成がサポートされていないPOSIXボーンシェルsh
で実行していると思います。
bash
がインストールされているパスにShebangを設定してスクリプトを実行します。 #!/usr/bin/env bash
はPATH
でbash
を検索し、bash
は常に#!/usr/bin/env
にあるとは限らないため、通常、/bin
を実行しても安全です。 Linux以外のシステム。 OpenBSDシステムでは、/usr/local/bin
にあります。
スクリプトはbash
(または/bin/sh
またはCのようなfor
- loopを理解するその他のシェル)ではなくksh93
によって解釈されている可能性があります。
スクリプトに#!
の行があることを確認してください
#!/bin/bash
ファイルの最上部(使用するシェルとパスに変更)、または適切なインタープリターを使用してスクリプトを明示的に実行します。次に例を示します。
bash ./scriptname
A3パラメータループ制御式in bashは次のように指定する必要があります:
for (( EXP1; EXP2; EXP3 ))
しかし、あなたの単純なケースでは、私は単に使用します:
for i in {2..4}; do ...
完全を期すために、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"