2012-04-16 2 views
0

私はファイル名のリストを持つテキストファイルを持っています。 AWKを使って特定の行番号から変数を作成したいと思います。私が使用して正しい出力を得る:AWKを使ってファイルから行を読み込んで変数を作成する

awk "NR==\$Line" /myPath/fileList.txt 

私は変数に、この出力を割り当てるとドキュメントから、私は私が仕事に次を期待した:

INFILE=$(awk "NR==\$Line" /myPath/fileList.txt) 

または

INFILE=`awk "NR==\$Line" /myPath/fileList.txt` 

しかし、

echo "\$INFILE" 

は空です。私はbashスクリプティングが初めてで、どんな指摘にも感謝します。

+0

をそれらのコマンドのどちらも出力を与えるためには供給されず、変数INFILEを設定します。 (最初のバージョンは「より良い」です) – Mat

+0

申し訳ありませんが、私は明らかにすべきでした。 echo "\ $ INFILE"は空白です。 – Sara

+0

ドル記号をエスケープすると、INFILE変数は展開されません。代わりに 'echo" $ INFILE "'を試してください。 – ghoti

答えて

0

ドル記号をマスクしないでください。

間違っ:

echo "\$INFILE" 

右:

echo $INFILE 
echo ${INFILE} 
echo "$INFILE" 
echo "${INFILE}" 

$ {X} - あなたが一緒にテキストを接着したい場合構築物は、便利です。

echo $INFILE0 

は、変数INFILE0を探します。 $ INFILEが5の場合、 "50"は生成されません。

echo ${INFILE}0 

INFILEを使う変数は空白と多かれ少なかれ予測不可能なテキストのために含まれている場合5.

アポストロフィが有用である場合、これは、50が生成されます。

あなたROWNUMBERは、パラメータの場合:

#!/bin/bash 
Line=$1 
INFILE=$(awk "NR==$Line" ./demo.txt) 
echo "$INFILE" 

INFILEは、複数のスペースまたはタブが含まれている場合は、「$ INFILE」はそれらを保持しながら、エコーの$ INFILEは、単一のスペースにそれらを凝縮でしょう。

+1

いいえ、INFILEは10回生成されません。それはINFILEの後に "0"を付けて生成します。このコンテキストでは、中括弧はパラメータ展開と中括弧拡張の両方に使用されません。前者のみです。あなたは 'INFILE = foo;を実行できます。 echo "$ {INFILE}" {0..9} '' foo0 foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9'を出力します。ちなみに、出力のために常に変数を引用するべきです。そしてそれらはアポストロフィ(一重引用符)ではなく、二重引用符です。 –

+0

これは、行番号をハードコーディングすることで動作します:infile = $(awk "NR == 1" /myPath/fileList.txt)。しかし、私はecho \ $ infileを使ってしか値を見ることができません。 echo $ infileは空白です。私はまだこれがなぜであるか理解しています。 – Sara

+0

@DennisWilliamson:INFILEが7の場合、70が生成されます。しかし、行の内容が数字であるという私の最初の印象は間違っています。私は最後にそれを認識していましたが、書いている間に中断され、最初の例を調整するのを忘れました。私は "あなたはいつも..."と同意しません - それはカーゴ・カルト・プログラミングです。 –

3

AWKコマンドの出力が変数に割り当てられます。変数の内容を表示するには、この操作を行います。あなたがいる場合、以下を参照(リテラル文字列は引用符で囲む必要があるリテラルのドル記号をエスケープする必要はありませんので

echo "$INFILE" 

をあなたのAWKコマンドの単一引用符を使用する必要がありますあなたは)代わりに、シェル変数を代用したい:

awk 'NR == "$Line"' /myPath/fileList.txt 

多くのバッククォートのフォームより好ましい$()フォームあなたが道で、バッククォートをエスケープ持っている理由(私は)理解していません。また、シェル変数や環境変数との名前の衝突を避けるために、小文字または大文字と小文字の変数名を慣習的に使用する必要があります。

infile=$(awk 'NR == "$Line"' /myPath/fileList.txt) 
echo "$infile" 

あなたの意図が$Lineという名前の変数の値がかなり使用されているリテラル文字列「$ライン」よりも、置換されなければならないということであれば、あなたはAWKの-v変数パッシング機能を使用する必要があります

infile=$(awk -v "line=$Line" 'NR == line' /myPath/fileList.txt) 
+0

$ line変数は私のジョブスケジューラSGEによって設定された環境変数です。私は私のサブミットスクリプトで変数名からエスケープする必要があると信じています。私は、infile = $(awk -v "行= $ SGE_TASK_ID" 'NR == line' /myPath/fileList.txt)を試みましたが、echo $ infileから同じ結果を得ています。 – Sara

+0

@サラ:最後の例はおそらく行く方法でしょう。 $ infile "'をエコーし​​たり、他の方法で変数を使うこともできます。 –

+0

ありがとうございます、あなたの例は理にかなっていて、うまくいくはずですが、それに続いて、私はまだecho "$ infile"と同じ空白の結果を得ています。 – Sara

関連する問題