0

そのため、コマンドラインから引数を受け取り、その変数をフィールドパラメーターとして使用して印刷するスクリプトを作成しようとしています。スクリプトでは、任意の番号または NF を使用する必要があります。

そう、

echo a b c | ./awkprint.sh 1 

最初のフィールドを出力します (a)

と、

echo a b c | ./awkprint.sh NF 

最後のフィールド (c) を出力します。

スクリプトの行にあるものは次のとおりです

awk -v awkvar=$1 '{print $awkvar}'

コマンドラインで使用する任意の数値に対して完全に機能します...ただし、NFを使用するとすぐに、それを $0 として扱い、すべてのフィールドを出力するように見えるので、次のようになります。

echo a b c | ./awkprint.sh NF

a b c

それ以外の、

echo a b c | ./awkprint.sh NF

c

私は何を間違っていますか?

4

1 に答える 1

0

これは、文字列"NF"が に変換されるため0です。

awk変換プロセスでは、有効な数値に変換できない文字列は に評価される0ため、 が得られますprint $0

からman awk:

変数の型付けと変換

  Variables and fields may be (floating  point)  numbers,  or
   strings,  or  both.   How the value of a variable is inter‐
   preted depends upon its context.   If  used  in  a  numeric
   expression,  it  will  be treated as a number; if used as a
   string it will be treated as a string.
   ...
   When a string must be converted to a number, the conversion
   is  accomplished using strtod(3).

そしてからman strtod

戻り値

  These functions return the converted value, if any.

  ...
  If no conversion is performed, zero is returned and the
  value of nptr is stored in the location referenced by
  endptr.

@Ed Mortonが指摘したように、あなたが望むことをするために、あなたは書くことができます:

#!/bin/bash
awk -v awkvar=$1 '{print (awkvar == "NF" ? $NF : $awkvar)}'

ただし、 が整数に変換可能な文字列でない場合と である$0場合の両方で出力されることに注意してください。awkvar"NF"

より適切なチェックは次のようになります。

#!/bin/bash
awk -v awkvar=$1 '{
    if (awkvar == "NF") { print; }
    else if (int(awkvar) != 0) { print $awkvar; }
    else { print "Error: invalid field specifier;" }
}'

int(awkvar) <= NFまた、印刷を避けるために -- をチェックすることもできます""

于 2013-02-25T14:35:11.940 に答える