エスケープシーケンス
awkでは、文字列定数をダブルクォーテーション「"」で囲って表現しますが、 ダブルクォーテーションを文字列として扱う場合は、 バックスラッシュ「\」で始まるエスケープシーケンス、「\"」で表現します。
文字を扱う外変では、「dq="\""」で初期設定しておくと、わかりやすいかもしれません。
| 固定リンク | コメント (0) | トラックバック (0)
awkでは、文字列定数をダブルクォーテーション「"」で囲って表現しますが、 ダブルクォーテーションを文字列として扱う場合は、 バックスラッシュ「\」で始まるエスケープシーケンス、「\"」で表現します。
文字を扱う外変では、「dq="\""」で初期設定しておくと、わかりやすいかもしれません。
| 固定リンク | コメント (0) | トラックバック (0)
awkスクリプトで絶対値を計算するには、ユーザー定義関数が必要になります。 if文を使ったスプリクトは
function abs(x){if(x<0){return -x}else{return x}}
となりますが、elseは省略できるので、
function abs(x){if(x<0){return -x}{return x}}
ユーザー定義関数は、どこに記述しても基本的にはOKのようですが、 END文以降に記述するとわかりやすいかもしれません。
| 固定リンク | コメント (0) | トラックバック (0)
四角/円のソリッドデータを書出しするバッチファイルです。 このままでは外変として使用できませんが・・・・・参考です。m(__)m
--------------------
@REM 四角ソリッドの作図
@echo off
REM
REM #jww
REM #cd
REM #0 基点(左下)を指示
REM #hr
REM #e
REM
jgawk 'BEGIN{x1=0;y1=0;x2=0;y2=5;x3=30;y3=0;x4=30;y4=5;print "sl",x1,y1,x2,y2,x4,y4,x3,y3}' nul>temp.txt
copy temp.txt jwc_temp.txt
del temp.txt
--------------------
@REM 円ソリッドの作図
@echo off
REM
REM #jww
REM #cd
REM #0 中心点を指示
REM #hr
REM #e
REM
jgawk 'BEGIN{pi=atan2(0,-1);x1=0;y1=0;r1=5;hp=1;zk=0;a1=0;a3=2*pi;f1=100;print "sc",x1,y1,r1,hp,zk,a1,a3,f1}' nul>temp.txt
copy temp.txt jwc_temp.txt
del temp.txt
| 固定リンク | コメント (4) | トラックバック (0)
2次元配列を使用して、水平/垂直方向に配列複写するスプリクトを検証してみました。
外変用バッチファイルに必要なREM文/AWK実行文は、
REM #h1 範囲選択
REM #1 X方向/Y方向移動量(点を指定)
REM #c X方向/列数を入力
REM #c Y方向/行数を入力
jgawk -vNX=%1 -vNY=%2 -f array.awk jwc_temp.txt>temp.txt
<array.awk>
--------------------
#配列複写
BEGIN{m=NX;n=NY}
#X方向/Y方向移動量
/^hp1/{dx=$2;dy=$3;for(i=1;i<=m;i++)for(j=1;j<=n;j++){x[i,j]=(i-1)*dx;y[i,j]=(j-1)*dy}}
/^#/,/NF==0/{
if($1=="#"){next}
if(NF==1){print}
if($1=="cn0"){print}
#線の複写
if(NF==4 && $1!="ci"){for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{if(i==1 && j==1){print " "}
else{printf "%.15g %.15g %.15g %.15g\n",$1+x[i,j],$2+y[i,j],$3+x[i,j],$4+y[i,j]}}}
#円の複写
if(NF==4 && $1=="ci"){for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{if(i==1 && j==1){print " "}
else{printf "%s %.15g %.15g %.15g\n","ci",$2+x[i,j],$3+y[i,j],$4}}}
#円弧・楕円・楕円弧の複写
if(NF==8 && $1=="ci"){for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{if(i==1 && j==1){print " "}
else{printf "%s %.15g %.15g %.15g %.15g %.15g %.15g %.15g\n","ci",$2+x[i,j],$3+y[i,j],$4,$5,$6,$7,$8}}}
#横文字の複写
if(NF==6 && $1=="ch"){for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{if(i==1 && j==1){print " "}
else{printf "%s %.15g %.15g %.15g %.15g %s\n","ch",$2+x[i,j],$3+y[i,j],$4,$5,$6}}}
#縦文字の複写
if(NF==6 && $1=="cv"){for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{if(i==1 && j==1){print " "}
else{printf "%s %.15g %.15g %.15g %.15g %s\n","cv",$2+x[i,j],$3+y[i,j],$4,$5,$6}}}
#点の複写
if(NF==3 && $1=="pt"){for(i=1;i<=m;i++)for(j=1;j<=n;j++)
{if(i==1 && j==1){print " "}
else{printf "%s %.15g %.15g\n","pt",$2+x[i,j],$3+y[i,j]}}}
}
| 固定リンク | コメント (2) | トラックバック (0)
寸法値の前に直径記号(φ)を追加するスクリプトです。 複数の寸法値を同時に変更可能。編集後、寸法図形は解除されます。
外変用バッチファイルは、REM #h1 を使用します。
--------------------
#直径記号
#設定
BEGIN{fai="φ";chw=2;sp=0.25;print "hd"}
#
#縮尺
/^hs/{for(i=0;i<=9;i++) S[i]=$(i+2);
S["a"]=$12;S["b"]=$13;S["c"]=$14;
S["d"]=$15;S["e"]=$16;S["f"]=$17}
/^lg/{lg=substr($1,3);sc=S[lg]}
#寸法値読取
/^cs/{dim=substr($6,2,15);dq=substr($6,1,1);
#寸法値編集
chdim=fai dim;ch=dq chdim;
#寸法値長さ
dn=length(dim);dl=dn*chw+(dn-1)*sp;
#文字長さ
chn=length(chdim);chl=chn*chw+(chn-1)*sp;
#文字座標移動/表示
if($5==0){dx=sc*(chl-dl)/2;print "ch",$2-dx,$3,$4,$5,ch}
else{dy=sc*(chl-dl)/2;print "ch",$2,$3-dy,$4,$5,ch}
}
#寸法線再表示
/^#/,/NF==0/{
if($1=="#"){next}
if($1=="msg"){next}
if(NF==1){print}
if(NF==4){print}
if($1=="pt"){print}
}
| 固定リンク | コメント (0) | トラックバック (0)
エンコーダ用のスリットを作図する外変です。 使う機会は、ほとんどないと思いますが・・・・・、For文の使い方を試してみました。
<slit.bat>
--------------------
@REM スリットの作図
@echo off
REM #jww
REM #cd
REM #0 原点を指定
REM #c 内径を入力(RI)
REM #c 外径を入力(RO)
REM #c スリット数(N)
REM #hr
REM #e
jgawk -vRI=%1 -vRO=%2 -vN=%3 -f slit.awk nul>jwc_temp.txt
--------------------
<slit.awk>
--------------------
#スリットの作図
#設定
BEGIN{ri=RI;ro=RO;n=N;pi=atan2(0,-1);th=2*pi/n}
#データ書出し
END{for(i=0;i<=n-1;i++)
{lth=i*th-th/4;uth=i*th+th/4;lang=180*lth/pi;uang=180*uth/pi;
lxs=ri*cos(lth);lys=ri*sin(lth);lxe=ro*cos(lth);lye=ro*sin(lth);
uxs=ri*cos(uth);uys=ri*sin(uth);uxe=ro*cos(uth);uye=ro*sin(uth);
printf "%.15g %.15g %.15g %.15g\n",lxs,lys,lxe,lye;
printf "%.15g %.15g %.15g %.15g\n",uxs,uys,uxe,uye;
printf "%s %g %g %.15g %.15g %.15g %g %g\n","ci",0,0,ri,lang,uang,1,0;
printf "%s %g %g %.15g %.15g %.15g %g %g\n","ci",0,0,ro,lang,uang,1,0}
}
| 固定リンク | コメント (0) | トラックバック (0)
寸法編集、カンマ付に対応させてみました。
#--------------------
#寸法値編集
BEGIN{if(N+0 == 0) exit;n=N;k=10;
#接頭語/カンマ/ピリオドの設定
mu="X";eq="=";cma=",";pd=".";
#文字幅/文字間隔の設定(cn4の場合)
chw=2;sp=0.25;
#選択図形の消去
print "hd"}
#
#縮尺
/^hs/{for(i=0;i<=9;i++) S[i]=$(i+2);
S["a"]=$12;S["b"]=$13;S["c"]=$14;
S["d"]=$15;S["e"]=$16;S["f"]=$17}
/^lg/{lg=substr($1,3);sc=S[lg]}
#寸法値読取(カンマ付対応)
/^cs/{dim=substr($6,2,15);dq=substr($6,1,1);dl0=length(dim)
split(dim,ca,",");ddt=length(ca[1]);
if(ca[2]+0==0 && ddt==1 && dl0>=2) {cm=1;cadim=ca[1]*1000}
if(ca[2]+0!=0){cm=1;cadim=ca[1] ca[2]}
if(ca[2]+0==0 && ddt>=2){cadim=ca[1]}
#ピッチ計算/四捨五入/(カンマ対応)
pch=cadim/n;pch=k*pch;pch=rnd(pch)/k;
split(pch,p,".");pdt=length(p[1]);
if(cm!=1){capch=pch}
if(cm==1 && pdt<=3){capch=pch}
if(cm==1 && pdt>=4 && p[2]+0==0){d1=substr(p[1],1,pdt-3);
d2=substr(p[1],pdt-2,3);capch=d1 cma d2}
if(cm==1 && pdt>=4 && p[2]+0!=0){d1=substr(p[1],1,pdt-3);
d2=substr(p[1],pdt-2,3);capch=d1 cma d2 pd p[2]}
#寸法値編集
chdim=n mu capch eq dim;ch=dq chdim;
#寸法値長さ
dn=length(dim);dl=dn*chw+(dn-1)*sp;
#文字長さ
chn=length(chdim);chl=chn*chw+(chn-1)*sp;
#文字座標移動/表示
if($5==0) {dx=sc*(chl-dl)/2;print "ch",$2-dx,$3,$4,$5,ch}
else{dy=sc*(chl-dl)/2;print "ch",$2,$3-dy,$4,$5,ch}}
#寸法線再表示
/^#/,/^NF==0/{if($1=="#"){next}if($1=="msg"){next}if(NF==1){print $1}
if(NF==4){print}if($1=="pt"){print}}
#
#四捨五入
function rnd(x){if(x>0) return int(x+0.5)}
| 固定リンク | コメント (0) | トラックバック (0)
情報交換室で sugi さんが、Ruby外変をすでに公開されていますが、
管理人の学習用にawk 版スクリプトを作成してみました。
注) 傾き寸法/カンマ付寸法値には対応していません。
文字幅/文字間隔は、2mm(半角)/0.5mmで設定
編集後は寸法図形が解除されます。
外変用バッチファイルには、下記のREM文(例)とawk実行文が必要です。
REM #h1 寸法線を矩形選択
REM #c 分割数の入力 jgawk -vN=%1 -f *****.awk jwc_temp.txt>temp.txt
--------------------
#寸法値編集
BEGIN{if(N+0 == 0) exit;n=N;k=10;
#接頭語の設定
mu="X";eq="=";
#文字幅/文字間隔の設定
chw=2;sp=0.25;
#選択図形の消去
print "hd"}
#
#縮尺
/^hs/{for(i=0;i<=9;i++) S[i]=$(i+2);
S["a"]=$12;S["b"]=$13;S["c"]=$14;
S["d"]=$15;S["e"]=$16;S["f"]=$17}
/^lg/{lg=substr($1,3);sc=S[lg]}
#寸法値読取
/^cs/{dim=substr($6,2,15);dq=substr($6,1,1);
#ピッチ計算/四捨五入
pch=dim/n;pch=k*pch;pch=rnd(pch)/k;
#寸法値編集
chdim=n mu pch eq dim;ch=dq chdim;
#寸法値長さ
dn=length(dim);dl=dn*chw+(dn-1)*sp;
#文字長さ
chn=length(chdim);chl=chn*chw+(chn-1)*sp;
#文字座標移動/表示
if($5==0) {dx=sc*(chl-dl)/2;print "ch",$2-dx,$3,$4,$5,ch}
else{dy=sc*(chl-dl)/2;print "ch",$2,$3-dy,$4,$5,ch}}
#寸法線再表示
/^#/,/^NF==0/{if($1=="#"){next}if($1=="msg"){next}if(NF==1){print $1}
if(NF==4){print}if($1=="pt"){print}}
#
#四捨五入
function rnd(x){if(x>0) return int(x+0.5)
| 固定リンク | コメント (0) | トラックバック (0)
ストレッチ機能+寸法編集のスプリクトを試してみました。 実用には、まったく向いていませんが・・・・・・。
<stretch.bat>
--------------------
@REM ストレッチ
@echo off
REM
REM #jww
REM #cd
REM #h2 図形選択
REM #c 伸縮する値を入力してください
REM #hr
REM #e
REM
jgawk -vDX=%1 -f stretch.awk jwc_temp.txt>temp.txt
copy temp.txt jwc_temp.txt
del temp.txt
--------------------
<stretch.awk>
--------------------
#ストレッチ
BEGIN{print "hd";dx=DX}
#寸法値の変更
/^cs/{chr=substr($6,2,20);dq=substr($6,1,1);split(chr,a," ");
dim=a[1];dim=dim+dx;ch=dq dim;
printf "%s %.15g %.15g %.15g %.15g %s\n","ch",$2+dx/2,$3,$4,$5,ch}
/^ch/{chr=substr($6,2,20);dq=substr($6,1,1);split(chr,a," ");
dim=a[1];dim=dim+dx;ch=dq dim;
printf "%s %.15g %.15g %.15g %.15g %s\n","ch",$2+dx/2,$3,$4,$5,ch}
#線データの伸縮
/^#/,/NF==0/{
if($1=="#"){next}
if($1=="msg"){next}
if(NF==1){print $1}
if(NF==4 && $1==$3){printf "%.15g %.15g %.15g %.15g\n",$1+dx,$2,$3+dx,$4}
if(NF==4 && $1>$3 && $2==$4){printf "%.15g %.15g %.15g %.15g\n",$3,$2,$1+dx,$4}
if(NF==4 && $1<$3 && $2==$4){printf "%.15g %.15g %.15g %.15g\n",$1,$2,$3+dx,$4}
if(NF==4 && $1!=$3 && $2!=$4)
{printf "%.15g %.15g %.15g %.15g\n",$1+dx,$2,$3+dx,$4}}
--------------------
| 固定リンク | コメント (0) | トラックバック (0)
jwc_temp.txtから、選択図形データを読込むバッチファイルの確認です。
--------------------
@REM 選択図形データの読込み
REM #jww
REM #cd
REM #h2 図形を範囲選択
jgawk '/^#/,/NF==0/{if($1=="#") next;print}' jwc_temp.txt>temp.txt
type temp.txt
pause
del temp.txt
--------------------
パターン1,パターン2{アクション}は、 パターン1からパターン2まで同じアクションを実行することができます。
NF==0 ⇒ 空白行 if($1=="#") next ⇒ 行の先頭が # の場合、アクションを実行せず次の行に。
外部変形からバッチファイルを実行すると、
| 固定リンク | コメント (0) | トラックバック (0)
"printf"の書式を確認するスクリプトです。 前回紹介したバッチファイルの2行目を編集してください。
<%f 浮動小数点>
jgawk 'BEGIN{N=12345.6789;printf"%%f",N}' nul>temp.txt
%f ⇒ 12345.678900 /小数点第6位まで表示(数値がない場合は、0を表示) % .3f ⇒ 12345.679 /小数点第3位まで表示(第4位を四捨五入)
<%g 浮動小数点/指数表示>
jgawk 'BEGIN{N=123.456789;printf"%%g",N}' nul>temp.txt
%g ⇒ 123.457 /6桁表示 % .15g ⇒ 123.456789 /15桁まで表示 % .3g ⇒ 指数表示 /N=1234の時 1.23e+004
| 固定リンク | コメント (0) | トラックバック (0)
"printf" で使用する出力書式をバッチファイルで確認。 注)一行スプリクトの場合は、%s を %%s で実行します。
<%s 文字列>
REM ##### 書式 %s #####
jgawk 'BEGIN{N="abcdefgh";printf"%%s",N}' nul>temp.txt
type temp.txt
pause
del temp.txt
REM #####
%s ⇒ abcdefgh /文字列をすべて出力 %10s ⇒ □□ abcdefgh /10文字分のスペースに右詰め (□はスペース) % .5s ⇒ abcde /先頭から5文字を出力
<%d 整数>
REM ##### 書式 %d #####
jgawk 'BEGIN{N=123456.789;printf"%%d",N}' nul>temp.txt
type temp.txt
pause
del temp.txt
REM #####
%d ⇒ 123456 /整数部だけを出力
%10d ⇒ □□□□123456 /10文字分のスペースに右詰め(□はスペース)
| 固定リンク | コメント (0) | トラックバック (0)
数値の小数点第2位を四捨五入するスクリプトファイルです。
##########
#
#四捨五入
BEGIN{k=10;x=N;x=x*k;y=rnd(x)/k}
END{print y}
#
#ユーザー定義関数
function rnd(x){if(x>0) return int(x+0.5)}
#
##########
function ~ return で、ユーザーが定義した関数を使用することができます。 int(x)は、数値の整数部を返すawkの組込関数です。
| 固定リンク | コメント (0) | トラックバック (0)
数字と文字を組合わせて文字列を出力するスプリクトの確認です。 算術演算子を使用しないと、数字が文字列として追加されています。
REM ##### 数字+文字 #####
REM
jgawk 'END{a=3;b=" × ";c=500;d=" = ";e=1500;f=a b c d e f;print f}' nul>temp.txt
type temp.txt
pause
del temp.txt
REM
REM #####
数字の一部を変数にすると、
REM ##### 変数+文字 #####
REM
jgawk 'END{N=500;a="3 × ";b=N;c=" = 1500";d=a b c;print d}' nul>temp.txt
type temp.txt
pause
del temp.txt
REM
REM #####
バッチファイルを実行すると、両方とも同じ結果になります。
| 固定リンク | コメント (0) | トラックバック (0)
外変実行中にユーザー入力をスプリクトで使用するバッチファイルの動作確認です。
ユーザー入力は、REM #c (数値入力) と REM #f (文字入力) を使用します。 REM #f は、自動的に日本語入力になります。
awk側は、 -v(変数名)=%(番号)で入力情報を読込みます。 注)このスクリプトは、jwc_temp.txt を読込む必要がないので、 入力ファイルは、 nul にしています。
--------------------
@REM ユーザー入力
REM #jww
REM #cd
REM #c 数値を入力してください
REM #f 文字を入力してください
REM #e
jgawk -vN=%1 -vT=%2 'BEGIN{print N,T}' nul>usr_input.txt
type usr_input.txt
pause
del usr_input.txt
--------------------
実行結果は、
| 固定リンク | コメント (0) | トラックバック (0)
awkの関数/演算子を抜粋してみました。必要に応じて追加していきます。
<算術演算子>
+ [和] , - [差] , * [乗] , / [除]
<関係演算子>
a==b [等しい(a=b)] , != [等しくない(a≠b)]
a<b [b より小] , a<=b [b 以下] , a>=b [b 以上] , a>b [b より大]
<論理演算子>
|| [論理和] , && [論理積]
<算術関数>
atan2(y,x) [y/xの逆正接 (単位:ラジアン)]
sin(x) [正弦 (x 単位ラジアン)]
cos(x) [余弦 (x 単位ラジアン)]
sqrt(x) [平方根] int(x) [整数部を返す]
<文字列関数>
substr(a,b,c) [適合する文字列を返す/a(文字列),b(開始文字),c(文字数)] split(a,b,c) [文字列を配列にして返す/a(文字列),b(配列名),c(区切り)] length(a) [文字列の長さを返す/a(文字列)]
| 固定リンク | コメント (1) | トラックバック (0)
書込レイヤグループの縮尺だけを書出しするスプリクトファイルの確認です。
例) hs 1 0.5 0.2 0.1 1 1 1 1 1 1 10 1 1 1 50 100
縮尺が1/10の場合、hsの値は、逆数の10で表示されます。 上記の例で、書込レイヤグループが"A"の場合の値を、変数 sc に代入してみます。
<scale.awk>
---------------
# 縮尺の書出し
# BEGINは省略
# 各レイヤーグループの縮尺を配列変数に代入
/^hs/{for(i=0;i<=9;i++) S[i]=$(i+2);
S["a"]=$12;S["b"]=$13;S["c"]=$14;
S["d"]=$15;S["e"]=$16;S["f"]=$17
}
# 書込みレイヤグループ
/^lg/{lg=substr($1,3);sc=S[lg]
}
# 書込レイヤグループの縮尺を出力
END{print lg,sc
}
---------------
実行結果は、
| 固定リンク | コメント (0) | トラックバック (0)
各レイヤグループの縮尺を書出すスプリクトファイルの動作確認です。
外部変形を実行すると、jwc_temp.txt に、各レイヤグループの縮尺が書出されます。 縮尺が全て 1/1 の場合 : hs 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
スプリクトファイルは、
レイヤグループ 0 : S[0]=$2
レイヤグループ 1 : S[1]=$3
-----
-----
レイヤグループ e : S["e"]=$16
レイヤグループ f : S["f"]=$17
として配列変数に代入してから、出力結果を確認します。
for(i=0;i<=9;i++) S[i]=$(i+2) は、レイヤグループ0~9 までの配列 S[0]~S[9] を定義 i++ は、i=i+1 と 同じです。
<scale.awk>
--------------------
# 縮尺の書出し
# BEGINは省略
# 各レイヤグループの縮尺を配列変数に代入
/^hs/{for(i=0;i<=9;i++) S[i]=$(i+2);
S["a"]=$12;S["b"]=$13;S["c"]=$14;
S["d"]=$15;S["e"]=$16;S["f"]=$17
}
# 縮尺を出力
END{
for(i=0;i<=9;i++) print S[i];
print S["a"],S["b"],S["c"],
S["d"],S["e"],S["f"]
}
--------------------
<scale.bat>
--------------------
REM 縮尺の書出し
REM #jww
REM #cd
jgawk -f scale.awk jwc_temp.txt>scale.txt
type scale.txt
pause
del scale.txt
--------------------
実行結果は、
| 固定リンク | コメント (0) | トラックバック (0)
一行スプリクトでデータが処理できない場合、スプリクトファイルが必要になります。 スプリクトファイルの拡張子は、"awk"、メモ帳で作成し "ファイル名".awk で 保存すればOKです。
バッチファイルから実行する際の表記は、 jgawk -f "ファイル名".awk 入力ファイル > 出力ファイル
例) jgawk -f sample.awk jwc_temp.txt > temp.txt
注) jgawk.exe と gawk..exe の両方を実行できる環境がある場合、 jgawk/gawk のどちらを使用してもOKです。
スプリクトファイルは、下記の様な構成になります。 #の行は、コメント
--------------------
#スプリクトファイルの構成
#データ処理前の準備(省略可)
BEGIN { アクション }
#データ処理
パターン1 { アクション }
パターン2 { アクション }
-----
-----
#データ処理後の出力操作(省略可)
END { アクション }
--------------------
| 固定リンク | コメント (0) | トラックバック (0)
円データを書出しするバッチファイルの動作確認です。
REM #nci n は1~9の整数、円/円弧/楕円/楕円弧が選択可
---------------
@REM 円データの書出し
REM #jww
REM #cd
REM #1ci 円を選択
REM #2ci 円弧を選択
REM #3ci 楕円を選択
REM #4ci 楕円弧を選択
type jwc_temp.txt
jgawk '/^^ci/{print}' jwc_temp.txt>circle.txt
type circle.txt
pause
del circle.txt
----------------
Jwwを起動して円/円弧/楕円/楕円弧を作図しておきます。
バッチファイルの実行結果:/^^ci/にマッチングするデータを書出し
---------------
円 ⇒ ci -30 25 15
円弧 ⇒ ci 30 25 15 30 225 1 0
楕円 ⇒ ci -30 -25 20 0 0 0.8 0
楕円弧 ⇒ ci 30 -25 20 35.8175256444436 161.482422246941 0.8 0
----------------
各データを個別に書出すスクリプトの例は、
<円データ> jgawk 'NF==4{if($1="ci"){print}}' jwc_temp.txt>circle.txt
<円弧データ>
jgawk 'NF==8{if($7==1){print}}' jwc_temp.txt>circle.txt
<楕円データ>
jgawk 'NF==8{if($5==$6){print}}' jwc_temp.txt>circle.txt
<楕円弧データ>
jgawk 'NF==8{if($7!=1){if($5!=$6){print}}}' jwc_temp.txt>circle.txt
注) != は、≠(等しくない)を示しています。
| 固定リンク | コメント (0) | トラックバック (0)
awkには、組込変数がいくつか用意されています。 すでに "フィールド" で紹介している、$2、$3 も組込変数のひとつです。 また、$0は、レコード(行)全体を出力します。
NR:読込んだレコード(行)の行番号を出力できます。
NF:読込んだレコード(行)内のフィールド(列)の数を出力できます。
<sample.txt> 前回ファイルの1行目と3行目に地方名を追加
関東 中部 東海 近畿 九州
中部 東海 近畿 関東
東海 近畿 中部 東海 北海道
近畿 四国 中国 九州
関東 東北 北海道 中部
---------------
行番号を表示 gawk '[print NR,$0}' sample.txt>awktest.txt
3行目だけを表示 gawk 'NR==3[print NR,$0}' sample.txt>awktest.txt
== は、等号と同じです。
フィールド(列)数が5のレコード(行)を表示 gawk 'NF==5[print NR,$0}' sample.txt>awktest.txt
| 固定リンク | コメント (0) | トラックバック (0)
Jww上で指示した点の座標を書出しするバッチファイルの動作確認です。
--------------------
@REM 点座標の書出し
REM #jww
REM #cd
REM #1 1点目を指定(L)/(R)
REM #2 2点目を指定(L)/(R)
type jwc_temp.txt
jgawk '/hp1/{print};/hp2/{print}' jwc_temp.txt>point.txt
type point.txt
pause
del point.txt
---------------
REM #n :n は、0~99までの整数、点を指示する場合に使用。 #0を指定すると、指定した点が書出しデータの原点になります。
バッチファイルを実行し、A3用紙枠の左下と右上を指示した結果です。
注)バッチファイルを試す場合は、Jwwフォルダ内に point.txt と同名のファイルが 存在しないことを確認して下さい。警告なしに上書きされてしまいます。 また、コマンドプロンプトを途中で終了すると、Jwwフォルダ内に、point.txt が 作成されたままになります。任意のキーを押して終了してください。
指定した2点の座標は、 /hp1/、/hp2/ のパターンで書出すことができました。
| 固定リンク | コメント (0) | トラックバック (0)
awkは、テキストファイルを一行ずつ読み込み、指定した"アクション"を実行します。 また、指定した"パターン"にマッチングする行を選択して実行することも可能。
バッチファイル上で実行するスプリクトの表記は、
gawk '/パターン/{アクション}' *.txt となります。
バッチファイル、awktxt.bat を作成し、テキストファイル sample.txtで確認します。
<sample.txt>
関東 中部 東海 近畿
中部 東海 近畿 関東
東海 近畿 中部 東海
近畿 四国 中国 九州
関東 東北 北海道 中部
<awktest.bat>
REM awktest
gawk '/関東/{print}' sample.txt>awktest.txt
type awktest.txt
pause
"パターン"は、"関東"を含む行、"アクション"は、awktest.txt に出力
awkの正規表現の解説では、/^関東/で機能するはずなのですが、 うまくマッチングしてくれないので・・・・・。 パターンを/^^関東/に変更し、"関東"が先頭となる行を出力させます。
| 固定リンク | コメント (0) | トラックバック (0)
公開されているawk関連のwebサイトで、スクリプトの勉強をしながら 外部変形に取組んでみたものの、やっぱり知識不足。m(__)m
あらためて、awkスプリクトの動作をJw_cad上で確認してみることにします。
動作環境は下記の通りです。
OS:Windows XP SP2 Jw_cad:バージョン5.11e awkプログラム:WILLs' trash can さんのgawkm115.zipをダウンロード。(作者様に感謝) gawk.exeとjgawk.exe(gawk.exeをリネーム)をsystem32フォルダ内にコピー。
| 固定リンク | トラックバック (0)
最近のコメント