2016-04-22 12 views
0

私は、テキストファイルtest.bedを通じてawks test.shファイルがあります:shでawkの各出力を繰り返し処理する方法は?

bash test.sh作品でこれを実行する
while read line;do 
    echo $line 
    # ... more code ... # 
done < <(awk -F '\t' '$1 == 1 {print $0}' test.bed) 

1 31 431 
1 14 1234 
1 54 134 
2 435 314 
2 314 414 

を、しかしsh test.shと、それは構文エラーを与えます。 bashの代わりにshを使用して上記を行うにはどうすればよいですか?


それが与えるエラーが

test.sh: line 5: syntax error near unexpected token `<' 
test.sh: line 5: `done < <(awk -F '\t' '$1 == 1 {print $0}' test.bed)' 
+0

エラーは何ですか? – vidit

+0

@vidit test.sh:予期しないトークンの近くに構文エラーがあります。

+0

どのenvを使用していますか?私はこの種のエラーを経験しなかった。完全なスクリプトを貼り付けてください。 – ClaudioM

答えて

2

Process Substitutionあるbash拡張である - POSIXで指定されていません。これはsh互換です。

#!/bin/sh 

awk -F '\t' '$1 == 1 {print $0}' test.bed | while read line; do 
echo $line 
    # ... more code ... # 
done 
+0

これは、test.bedの内容、あなたがツールを実行するディレクトリ、環境設定などのさまざまな組み合わせを与えてくれるバグで詰まっています。またawkコードも冗長ですがそれほど重要ではありません。 ** IF **このようなシェルループが必要だった場合、それを書く方法は 'awk -F '\ t" $ 1 == 1' test.bed | IFS = read -r行です。 do echo "$ line"; done'。あなたのシェルが追加の堅牢性をサポートしている場合は、 'echo'の代わりに' printf'を使用してください。 –

+0

いいえ、アプローチが間違っていると言いました。アプローチが正しかったとしても、それを実装するにはまだ答えが間違っていました。私の最初のコメントを参照してください。 –

+0

元のスクリプトは、 '#!/ bin/bash'で始まっていれば動作します。私はスクリプトでbashismsを避けようとしていますが、元のポスターが持っていなければならない理由はありません。 – Eric

関連する問題