0

ファイル名のリストを含むテキスト ファイルがあります。AWK を使用して特定の行番号から変数を作成したいと考えています。次を使用して正しい出力を取得します。

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

この出力を変数に割り当てたいのですが、ドキュメントから、次のように動作すると予想していました。

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

また

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

でも、

echo "\$INFILE" 

は空白です。私は bash スクリプトを初めて使用するので、何かアドバイスをいただければ幸いです。

4

2 に答える 2

3

AWK コマンドの出力は変数に割り当てられます。変数の内容を表示するには、次のようにします。

echo "$INFILE"

リテラルのドル記号をエスケープする必要がないように、AWK コマンドには一重引用符を使用する必要があります (リテラル文字列は引用符で囲む必要があります。代わりにシェル変数を代用する場合は、以下を参照してください)。

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

この$()形式は、バッククォート形式よりもはるかに好まれます (ちなみに、なぜバッククォートがエスケープされているのかわかりません)。また、シェルまたは環境変数との名前の衝突を避けるために、小文字または大文字小文字混合の変数名を習慣的に使用する必要があります。

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

$Lineリテラル文字列 "$Line" を使用するのではなく、名前付きの変数の値を代入する必要がある場合は、AWK の-v変数受け渡し機能を使用する必要があります。

infile=$(awk -v "line=$Line" 'NR == line' /myPath/fileList.txt)
于 2012-04-16T20:58:59.913 に答える
0

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

違う:

 echo "\$INFILE" 

右:

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

${x} - 構文は、テキストをくっつけたい場合に便利です。

 echo $INFILE0

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

 echo ${INFILE}0

INFILE が 5 の場合、これは 50 を生成します。

アポストロフィは、変数に空白が含まれている場合や、多かれ少なかれ予測できないテキストの場合に役立ちます。

行番号がパラメーターの場合:

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

INFILE に複数のスペースまたはタブが含まれている場合、echo $INFILE はそれらを 1 つのスペースに圧縮しますが、"$INFILE" はそれらを保持します。

于 2012-04-16T20:58:41.183 に答える