2017-09-28 16 views
0

awkコマンドにファイルの名前を格納するシェル変数を渡したいだけです。私がネット上でこの問題を検索したとき、私は多くの異なるオプションを見ましたが、どれも私のために働いていませんでした。私は以下のことを試してみました:シェルスクリプト内でシェル変数をawkコマンドに渡す方法

#!/bin/bash 
for i in "[email protected]" 
do 
case $i in 
    -p=*|--producedfile=*) 
    PFILE="${i#*=}" 
    shift # past argument=value 
    *) 
      # unknown option 
    ;; 
esac 
done 
echo "PRODUCEDFILE = ${PFILE}" 
awk -v FILE=${PFILE} '{print FILE $0}' #DIDNT WORK 
awk '{print FILE $0}' ${PFILE} # DIDNT WORK 
awk -v FILE=${PFILE} '{print $0}' FILE #DIDNT WORK 
+0

ない:だから、あなたはまた、最後の行を書くことができますか? – Inian

+0

@Inian $ PFILEはあなたが言ったようにAwkが処理するべきファイルの名前です。 これはmybash.shという名前のbashスクリプトの内部にあるとします。次に、私は次のコマンドを呼び出します:bash mybash.sh -p = inputfile.txt – zwlayer

+3

なぜ 'awk '{print FILE $ 0}' $ {PFILE}'は動作しませんでしたか? 'FILE'変数はここでは定義されていません。私はこれが 'inputfile.txt'の内容を1行で1行ずつ出力したと確信しています – Inian

答えて

2

awkにシェル変数を渡すには、あなたが正しく-vオプションを使用していました。

しかし、shiftは(あなたがforとオプションを反復している)、;;は、(あなたが各ケースのブランチを終了する必要が)行方不明になっただけでなく、処理するために、awkのためのファイルの名前だった不必要でした。固定、スクリプトは次のようになります。しかし

#!/bin/bash 
for i in "[email protected]"; do 
    case $i in 
     -p=*|--producedfile=*) 
      PFILE="${i#*=}" 
      ;; 
     *) 
      # unknown option 
      ;; 
    esac 
done 

echo "PRODUCEDFILE = ${PFILE}" 
awk -v FILE="${PFILE}" '{print FILE, $0}' "${PFILE}" 

注、awkはすでにFILENAME変数で利用可能な、現在処理されたファイルの名前になります。私は `$ PFILE`は、ファイルの名前である` Awk`が上処理しなければならない(または)単に身体に渡され、それを得ることを確認

awk '{print FILENAME, $0}' "${PFILE}" 
関連する問題