スクリプト内でawkの動作が変わります。

スクリプト内でawkの動作が変わります。

RCTI-形式の注文番号フィールドと、注文番号を構成する英数字を含む「ベンダー請求書番号」で始まる行を含むテキストファイル「invoice.txt」があります。

次のコマンドを入力すると:

awk '/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}' /mnt/path/invoice.txt

コマンドラインまたはbashのスクリプトで実行すると、REA-0130193/2などの請求書番号が返されます(RCTI-次の部分のみが必要です。この場合は正しいです)。各実行時に請求書ファイルの総数を処理するのではなく、新しいファイルのディレクトリに到着する新しいinotifywaitテキストファイルでのみ作業することを含む新しいスクリプトに統合しました。

    inotifywait -m /mnt/path -e create -e moved_to |
    while read path action file; do

        i="$path$file"
        echo "$i"
        orderno="$(awk '/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}' $i)"
        echo "$orderno">>test.txt
    done

この方法も機能します。テキストファイルが到着すると、「test.txt」に新しい注文番号が生成されます。ただし、次のように呼び出してこのコマンドを含むスクリプトを実行した場合:

~/script.sh& or ~/script.sh &

他のスクリプトから、この場合私は対価として何も得られず、それは私を狂わせます。スクリプト内のスクリプトの場合は動作が停止しますが、端末またはバックグラウンドで直接実行すると正しく動作する理由を知っている人はいますか?

私をさらに混乱させることは、次のいずれかの形式を含む他のawkコマンドが同じscript.shで動作し続けることです。

paidamount="$(awk '/Payment Amt/ {gsub(",","",$11) ; print $11;exit}' $i)"
    echo "$paidamount">>test.txt

特殊文字に関する懸念のため、次の内容で別々のorderno.awkファイルを作成しました。

#! /usr/bin/awk -f

/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}

そして電話してください

orderno="$(~/orderno.awk $i)"

同じスクリプト内では動作は変わりません。

コマンドを次のように作成します。

orderno="$(awk '/Vendor Invoice No/ {gsub(/RCTI-/,"",$4) ; print $4 ; exit}' $i)"

私は違いを見ることができません。

ベストアンサー1

したがって、Gordon Davissonが提案したように、inotifywait行を次のように変更します。

inotifywait -m /mnt/path -e close_write | while read path action file; do

これでファイルにawkを適用すると、ファイルの一部ではなくファイル全体が表示されるため、問題が解決しました。前の構文を使用してテキストファイルを書き込むために開いたが、不完全で一部適用されたawkコマンドが機能します。 inotifywaitイベントをcreateからclose_writeに変更すると、目的が達成されます。

おすすめ記事