2007年8月14日 (火)

エスケープシーケンス

awkでは、文字列定数をダブルクォーテーション「"」で囲って表現しますが、            ダブルクォーテーションを文字列として扱う場合は、                      バックスラッシュ「\」で始まるエスケープシーケンス、「\"」で表現します。

文字を扱う外変では、「dq="\""」で初期設定しておくと、わかりやすいかもしれません。

| | コメント (0) | トラックバック (0)

2007年8月 8日 (水)

絶対値

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)

2007年7月28日 (土)

ソリッドデータの書出し

四角/円のソリッドデータを書出しするバッチファイルです。                   このままでは外変として使用できませんが・・・・・参考です。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)

2007年7月 1日 (日)

配列複写

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)

2007年6月25日 (月)

寸法編集(直径記号)

寸法値の前に直径記号(φ)を追加するスクリプトです。                         複数の寸法値を同時に変更可能。編集後、寸法図形は解除されます。

外変用バッチファイルは、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)

2007年6月23日 (土)

スリットの作図

エンコーダ用のスリットを作図する外変です。                          使う機会は、ほとんどないと思いますが・・・・・、For文の使い方を試してみました。

070623_3   

<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)

2007年6月17日 (日)

寸法編集(カンマ付)

寸法編集、カンマ付に対応させてみました。                            

070617

#--------------------
#寸法値編集
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)

2007年6月10日 (日)

寸法編集

情報交換室で 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)

2007年6月 6日 (水)

ストレッチ

ストレッチ機能+寸法編集のスプリクトを試してみました。                      実用には、まったく向いていませんが・・・・・・。

070605

<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)

2007年6月 3日 (日)

選択図形データの読込み

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 ⇒ 行の先頭が # の場合、アクションを実行せず次の行に。

070603_1

外部変形からバッチファイルを実行すると、

070603_2_1                                    

| | コメント (0) | トラックバック (0)

2007年6月 2日 (土)

文字列の分解

文字列関数 "split" を使って、文字列をスペース区切り毎に分解する            バッチファイルの確認です。

REM ##### 文字列の分解 #####
jgawk 'BEGIN{chr="3 X 500 = 1500";split(chr,ch," ")};END{print ch[1];print ch[2];print ch[3];print ch[4];print ch[5]}' nul>temp.txt
type temp.txt
pause
del temp.txt
REM #####

070602

| | コメント (0) | トラックバック (0)

2007年5月30日 (水)

書式(浮動小数点)

"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)

2007年5月29日 (火)

書式(文字列/整数)

"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)

2007年5月26日 (土)

四捨五入

数値の小数点第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 #####

バッチファイルを実行すると、両方とも同じ結果になります。

070526

| | コメント (0) | トラックバック (0)

2007年5月14日 (月)

ユーザー入力

外変実行中にユーザー入力をスプリクトで使用するバッチファイルの動作確認です。

ユーザー入力は、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
--------------------

実行結果は、

070514_1

070514_2

070514_3

| | コメント (0) | トラックバック (0)

2007年5月13日 (日)

演算子/関数

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)

2007年5月 7日 (月)

縮尺の書出し2

書込レイヤグループの縮尺だけを書出しするスプリクトファイルの確認です。

例) 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
}

--------------- 

実行結果は、

070507_1                          

| | コメント (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
-------------------- 

実行結果は、

070507

| | コメント (0) | トラックバック (0)

2007年5月 6日 (日)

スプリクトファイル

一行スプリクトでデータが処理できない場合、スプリクトファイルが必要になります。         スプリクトファイルの拡張子は、"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)

レイヤグループの書出し

書込みレイヤグループを書出しするバッチファイルの動作確認です。

substr(a,b,c)  a:文字列/b:先頭位置/c:文字列長さ

---------------
@REM レイヤグループの書出し
REM #jww
REM #cd

jgawk '/^lg/{lg=substr($1,3,1);print $1,lg}' jwc_temp.txt>layer.txt
type layer.txt
pause
del layer.txt
---------------

書込みレイヤグループを "3" に移動して実行した結果                     文字列 "lg3" から右端の "3" が取出されました。

070506_1_2                      

| | コメント (0) | トラックバック (0)

2007年5月 5日 (土)

線データの書出し

線のデータを書出しするバッチファイルの動作確認です。

REM #kln   k は、1~9の整数、線を選択

---------------
@REM 線データの書出し
REM #jww
REM #cd
REM #1ln 線を選択
REM #2ln 線を選択

type jwc_temp.txt
jgawk 'NF==4{print}' jwc_temp.txt>line.txt
type line.txt
pause
del line.txt
---------------

用紙枠の角に対角線を作図、実行した結果

070505_3  

| | コメント (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を起動して円/円弧/楕円/楕円弧を作図しておきます。

070505_1

バッチファイルの実行結果:/^^ci/にマッチングするデータを書出し

070505_2

---------------

円 ⇒ 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)

2007年5月 4日 (金)

組込変数 NR/NF

awkには、組込変数がいくつか用意されています。                        すでに "フィールド" で紹介している、$2、$3 も組込変数のひとつです。           また、$0は、レコード(行)全体を出力します。

NR:読込んだレコード(行)の行番号を出力できます。

NF:読込んだレコード(行)内のフィールド(列)の数を出力できます。

<sample.txt>                                               前回ファイルの1行目と3行目に地方名を追加

関東 中部 東海 近畿 九州
中部 東海 近畿 関東
東海 近畿 中部 東海 北海道
近畿 四国 中国 九州
関東 東北 北海道 中部 

---------------

行番号を表示                                            gawk '[print NR,$0}' sample.txt>awktest.txt

070504_2

3行目だけを表示                                         gawk 'NR==3[print NR,$0}' sample.txt>awktest.txt

== は、等号と同じです。

070504_3_1

フィールド(列)数が5のレコード(行)を表示                                      gawk 'NF==5[print NR,$0}' sample.txt>awktest.txt

070504_4

| | コメント (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 が       作成されたままになります。任意のキーを押して終了してください。 

070504_1  

指定した2点の座標は、 /hp1/、/hp2/ のパターンで書出すことができました。

| | コメント (0) | トラックバック (0)

2007年5月 3日 (木)

フィールド

awkは、各行毎に空白を区切りとして "フィールド" を割当てます。                フィールド名は、先頭から $1、$2・・・・・・$N で割当てられます。

前回のバッチファイルの "アクション" を変更してみます。                     先頭文字が"関東"の行を選択し、2番目/3番目の文字を出力します。

REM awktest
gawk '/^^関東/{print $2,$3}' sample.txt>awktest.txt
type awktest.txt
pause

070503_3_1

フィールド間には、別の数字や文字を追加することができます。                "アクション"を{print $2,123,"ABC",$3} に変更すると、

070503_4_1

| | コメント (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 に出力

070503_1_1

awkの正規表現の解説では、/^関東/で機能するはずなのですが、              うまくマッチングしてくれないので・・・・・。                             パターンを/^^関東/に変更し、"関東"が先頭となる行を出力させます。                        

070503_2

| | コメント (0) | トラックバック (0)

2007年5月 2日 (水)

動作確認の前に

公開されている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)