興味深いawkの問題[閉じる]

興味深いawkの問題[閉じる]

スクリプトは文字で始まるコードを削除するようです。 P3420を3420に置き換えると、スクリプトは期待どおりに機能します。何が起こったのかわかりません。

入力する:

99443 - PHYS電話E/M 21~30分、、、、、306、、、、

2341、ゲバッハ、バットマン、2005年1月12日、2005年1月10日、230.04、100.00、0.00、

3678章、デステファ、フラッシュ、2005年1月27日、2005年2月2日、230.04、100.00、130.04、

99443 - PHYS 電話 E/M 21-30 分の合計:,,,,,306,,,,

P3420 B12注射 - B12注射、、、、、15、、、、、

3437章, Godot,09/04/2002,09/12/2002,,10.00,10.00,0.00,

3513

スクリプト:

while read line
do
    # Debugging:
    if [ -z "$(echo "$line" | awk -F"," '{ print $3 }')" ]
    then
            #echo "$line"
            #if [ echo "$line" | grep '-' ]
            #then
                   var=$(echo "$line" | grep '-' | cut -d" " -f1)
                    echo $var
    fi

    if [ -n "$(echo "$line" | awk -F"," '{ print $3 }')" ]

    then
            echo "$line" | awk -F"," '{ $6='$var';print }' >> testingfile.txt


    fi
 done < $1

出力:

2341ゲババットマン2005/12/01 2005/13/0199443230.04 100.00 0.00

3678デステファフラッシュ2005年1月27日2005年2月4日99443230.04 100.00 130.04

3437チャプゴードン2002年9月4日2002年9月13日10.00 10.00 0.00

3513章サジョアハ10/08/2002 10/08/2002 10.00 0.00 10.00

答え1

うわー!このスクリプトが何をしたいのかを推測してみましょう。

外部while readループはファイルを一度に1行ずつ読み込みます\

最初のテストでは、カンマで区切られた3番目のフィールドが空であることを確認し、空の場合は空の場合(行にvar文字がない場合)、最初のスペースの前の文字に設定します。-次にvarを印刷します。

2番目のテストでは、カンマで区切られた3番目のフィールドが空でないことを確認します。を使用する代わりに再テストする理由がわかりませんelse。カンマで区切られた6番目のフィールドが値に設定され、その$var行が印刷されます。

したがって、行が最初のテストに達してから始まると、P3420 B12varはに設定されますP3420。 2番目のawkコマンドは次のとおりです。

awk '-F,' '{$6=P3420;print}'

そしてP3420という変数がないので、デフォルトは空の文字列です。P削除して$6=3420整数を割り当てると、すべてが正常です。したがって、問題の根本的な原因は引用不足です。コマンドは次のようにする必要があります

awk '-F,' '{$6="'$var'";print}'

1行に少なくとも4つのプロセスを実行するのはかなり高価です! Unixプロセスは安いですが、それほど安くはありません!フルファイルはawkプロセスとして扱うことができます。

出力でコンマを維持するには、BEGINブロックでOFSに割り当てを追加します。

awk -F',' 'BEGIN { OFS="," }
           $3!="" { $6=zone; print }
           $3=="" { split($1,a,/ /) ; zone=a[1] }' $1

関連情報