1

このプログラムが機能しない理由を教えてください?? それを改善するのを手伝ってください。

for i in $(seq 2 30); do awk '{if ($i < 0.05) print $1,$i}' test.txt > phen_$i.txt; done

ファイル test.txt は次のようになります。

name    phen1   phen2
rs549   0.02    0.02
rs699   0.03    0.03
rs701   1   1
rs751   0.449   0.449
rs884   1   1
rs923   0.9775  0.02
rs970   0.9836  0.03
rs1085  0.0001  0.99
rs1220  0.9316  0.9316

出力ファイルは、if 条件に従ってそれぞれ col1 と col2、および col1 と col3 を含む phen_2.txt と phen_3.txt という 2 つの異なるファイルであると予想されます。

phen_2.txt の予想される結果:

rs549 0.02
rs699 0.03
rs1085 0.0001

phen_3.txt の予想される結果:

rs549 0.02
rs699 0.03
rs923 0.02
rs970 0.03

助けてください!

4

2 に答える 2

2
for ((i = 2; i <= 30; i++)); do awk -v i="$i" '$i < 0.05 {print $1, $i}' test.txt > "phen_$i.txt"; done

変数の受け渡し ( -v) を使用して、シェル変数を AWK スクリプトに取得します。

必要ありませんseq

編集:

私の一部の熱心で悪いエラーを修正しました。

AWK 内で完全に同じことを行う方法は次のとおりです。

awk '{for (i = 2; i <= 30; i++) {if ($i < 0.05) {print $1, $i > "phen_" i ".txt"}}}' test.txt

これは入力ファイルを一度だけ通過しますが、入力の各行に対して出力ファイルのセットを循環します。シェル バージョンは、入力ファイルを繰り返し読み取りますが、各出力ファイルへの書き込みは 1 回です。

于 2012-07-10T11:13:52.777 に答える
1

$'$i'の代わりに使用$:

for i in $(seq 2 30)
do
  awk '{if ($'$i' < 0.05) print $1,$'$i'}' test.txt > phen_$i.txt
done

問題は$i、bash から' '-string に入れないことです。$iそのため、前に文字列を閉じて、直後にもう一度開く必要があります。

于 2012-07-10T11:12:08.907 に答える