スクリプトは文字で始まるコードを削除するようです。 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 B12
varはに設定されます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