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ループ構成がサポートされていないsh
POSIX bourneシェルでこれを実行していると思います。((
bash
スクリプトを実行し、shebangをインストールパスに設定します。#!/usr/bin/env bash
検索は常に可能なわけではないので、通常これを行うのは安全です。#!/usr/bin/env
特にLinux以外のシステムではさらにそうです。 OpenBSDシステムの場合。PATH
bash
bash
/bin
/usr/local/bin
答え2
スクリプトは/bin/sh
(bash
またはksh93
Cに似たループを理解する他のシェル)によって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"