0

次の awk スクリプトがあります。

#! /bin/awk -f

BEGIN { FS = ":" }

{ print $1 " "  $2 " "  $3 " " $4 " "  }

「#! /bin/bash」を使用して bash スクリプトをコーディングしたいのですが、それにファイルを含める必要があります。プログラムがファイルを表示するとき。

#! /bin/bash

awk -f, '
FILENAME= $1
BEGIN { FS = ":" }

{ print $1 " "  $2 " "  $3 " " $4 " "  }

'

上記のコードで、ファイルをインクルードしようとしましたが、うまくいきませんか?

4

3 に答える 3

2

ここで何を渡したいのかは明確ではありません。ファイル名を値として取得する変数が必要ですか? これを行う最も簡単な方法は、次を使用すること-v var=valueです。

#! /bin/bash

awk -v MYFILENAME="$1" '
BEGIN { FS = ":" }

{ print MYFILENAME " " $1 " "  $2 " "  $3 " " $4 " "  }
'

FILENAME は予約済みの変数であり、設定できないことに注意してください。

または、入力ファイルを渡しますか? その場合は、次のようにプログラムを通過するだけです。

#! /bin/bash

awk '
BEGIN { FS = ":" }

{ print MYFILENAME " " $1 " "  $2 " "  $3 " " $4 " "  }
' "$1"

-fオプションは、スクリプトを含めることですawk-f,という名前のファイルを含めるように AWK に要求します,

シェル レベルでは、スペースを含むファイル名を正しく処理できるように、常に変数を"..."で囲むようにしてください。"$1"

于 2012-04-22T15:35:08.220 に答える
0

ファイル名を取得するために実際に bash を使用する必要はありません。

[ghoti@pc ~]$ cat text
one:two:three:four
cyan:yellow:magenta:black
[ghoti@pc ~]$ cat doit.awk
#!/usr/bin/awk -f

BEGIN { FS=":" }

{
  printf("%s %s %s %s\n", $1, $2, $3, $4);
}

[ghoti@pc ~]$ ./doit.awk text     
one two three four
cyan yellow magenta black
[ghoti@pc ~]$ 

しかし、Tim が示唆したように、質問に含めた内容に基づいて、探している結果を把握することは困難です。他の理由で bash 内で awk スクリプトを実行する必要が本当にありますか? awkスクリプト内で実際にファイル名を使用できるようにする必要がありますか?

質問が詳細であればあるほど、回答の詳細がより正確になります。

于 2012-04-23T01:53:14.287 に答える
0

質問からはわかりにくいですが、あなたが求めているのは

#!/usr/bin/env bash

awk -F, '
{ 
  #do stuff
}' "$1"

これにより、シェル スクリプトに渡したファイルに対して awk が実行されます。

ただし、awk 内でスクリプト変数の置換が必要な場合は、リテラル文字列からエスケープして変数置換を取得できます。例えば:

#!/usr/bin/env bash

filename="$1"
awk -F, '
{ 
  print "'"$filename"'"
}' "$1"

は、ファイル内の行数と同じ数の渡されたファイル名を出力します。これにより、awk はこれらの変数をすべてリテラル文字列として扱うことに注意してください。したがって、これも同様に機能します。

#!/usr/bin/env bash

filename="$1"
awk -F, '
BEGIN {
  awksFileName="'"$filename"'"
}
{ 
  print awksFileName
}' "$1"
于 2012-04-22T15:31:22.577 に答える