コミュニティ/Netnews 斜め読み

トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

comp.lang.awk

  • Netnews の comp.lang.awk を適当に日本語訳して抜粋してあります。(本当に適当です)
  • 書き込んだ人の名前の部分はオリジナルの投稿者の名前に変更させていただきましたが、時間までは変更していません。詳しくは、comp.lang.awk を購読していただくか、Google グループの comp.lang.awk などで確認してください。
  • 件数が増えてきたら古いものから順に過去ログに移動します。過去ログは [complangawk] から参照できます。

最近のタイトル一覧

[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ]

comp.lang.awk

お名前
件名
本文

Simple expression evaluator by awk. - deeperbluecat (2006年04月15日 21時55分36秒)

echo "(3-1)*2.3-8.5%3-(9.12+2*3)/2@" | awk -f eval.awk

のような簡単な数式を入れると評価するようなものを考えています。

また、sin, cos, log のような関数も評価させたいのですが、どうすればいいでしょうか?

#! /usr/bin/awk
# simple expression evaluator awk version
# author : dbcat
# email: deeperbluecat@gmail.com
# usage: example :
# echo "(3-1)*2.3-8.5%3-(9.12+2*3)/2@" | awk -f eval
# echo 1+2+3*2 @| awk -f eval
# awk -f eval <( seq 1 100|tr "\n" "+"|sed 's/+/@/100' )
# expression must be end with "@"
# Under GNU bash, version 3.00.16(1)-release (i586-suse-linux)
# GNU Awk 3.1.4
# have fun




BEGIN{


symbol="+-*%/()@";



oppr["++"]=">";oppr["+-"]=">";oppr["+*"]="<";oppr["+/"]="<";oppr["+%"]="<";oppr["+("]="<";
oppr["+)"]=">";oppr["+@"]=">";
oppr["-+"]=">";oppr["--"]=">";oppr["-*"]="<";oppr["-/"]="<";oppr["-%"]="<";oppr["-("]="<";
oppr["-)"]=">";oppr["-@"]=">";
oppr["*+"]=">";oppr["*-"]=">";oppr["**"]=">";oppr["*/"]=">";oppr["*%"]="<";oppr["*("]="<";
oppr["*)"]=">";oppr["*@"]=">";
oppr["/+"]=">";oppr["/-"]=">";oppr["/*"]=">";oppr["//"]=">";oppr["/%"]="<";oppr["/("]="<";
oppr["/)"]=">";oppr["/@"]=">";
oppr["%+"]=">";oppr["%-"]=">";oppr["%*"]=">";oppr["%/"]=">";oppr["%%"]=">";oppr["%("]="<";
oppr["%)"]=">";oppr["%@"]=">";
oppr["(+"]="<";oppr["(-"]="<";oppr["(*"]="<";oppr["(/"]="<";oppr["(%"]="<";oppr["(("]="<";
oppr["()"]="=";
oppr[")+"]=">";oppr[")-"]=">";oppr[")*"]=">";oppr[")/"]=">";oppr[")%"]=">";
               oppr["))"]=">";oppr[")@"]=">";
oppr["@+"]="<";oppr["@-"]="<";oppr["@*"]="<";oppr["@/"]="<";oppr["@("]="<";oppr["@%"]="<";
               oppr["@@"]="=";


}



{
   gsub(/[-*%+()/@]/," & ",$0);
   expression=$0;
}



END{

 split(expression,Ex," ");

 print evaluate(Ex);

}








function evaluate(Ex,OP,OF,c,k,t,x,str,y,r)
 {
    k=1;
    push(OP,"@");
    c=Ex[k];
    while(c!="@" || gettop(OP)!="@")
      {
        if(index(symbol,c)==0)
          {
            push(OF,c);
            k=k+1;
            c=Ex[k];

          }else
          {
            t=priority(oppr,gettop(OP),c);
            if(t=="<")
             {
               push(OP,c);
               k=k+1;
               c=Ex[k];

             }else if(t=="=")
             {

               pop(OP);
               k=k+1;
               c=Ex[k];
             }else{

               str=pop(OP);
               y=pop(OF);
               x=pop(OF);
               r=calculate(x,str,y);
               push(OF,calculate(x,str,y));

            }

          }

      }
  return gettop(OF);
 }




function calculate(x,st,y)
 {
    if(st=="+")
      return x+y;
    else if(st=="-")
      return x-y;
    else if(st=="*")
      return x*y;
    else if(st=="%")
      return x%y;
    else if(st=="/")
      return x/y;
 }




function priority(oppr,op1,op2)
 {
   return oppr[op1""op2];
 }




function gettop(arr,k,t)
 {
    k=0;
    for(t in arr)
     {
        k++;
     }
    return arr[k-1];
 }



function push(arr,x,t,k)
{
  k=0;
  for(t in arr)
   {
      k++;
   }
 arr[k]=x;

}



function pop(arr,va,t,u)
{
  u=0;
  for(t in arr)
    {
      u++;
    }
  va=arr[u-1];
  delete arr[u-1];
  return va;
}

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/2d86729fb7bfae5d/5bf63ce5c2c77732?hl=ja#5bf63ce5c2c77732


Re: - Jürgen Kahrs (2006年04月15日 21時56分50秒)

"Alan Linton calc3" でググってください。

または、以下の 6.5 章を見てください。

Re: - hi_saito (2006年04月15日 22時00分01秒)

ちなみに、calc3 のコードは以下のようなものです。(管理人より)

# calc3 - infix calculator - derived from calc3 in TAPL, chapter 6.
# by Kenny McCormack, Mon 3 Jan 2000
# modified by Alan Linton, $Date: 2000/01/06 21:37:36 $, $Revision: 1.16 $

BEGIN { eval("x=86") ; eval("y=99") }

{
printf "%20s = %15s\n", $0,eval($0)
}

# The rest is functions...
function eval(s ,e) {
_S_expr = s
gsub(/[ \t]+/,"",_S_expr)
if (length(_S_expr)==0) return 0
_f = 1
e = _expr()
if (_f <= length(_S_expr))
printf("An error occurred at %s\n", substr(_S_expr,_f))
else return e
}

function _expr( var,e) { # term | term [+-] term
if (match(substr(_S_expr,_f),/^[A-Za-z_][A-Za-z0-9_]*=/)) {
var = _advance()
sub(/=$/,"",var)
return _vars[var] = _expr()
}
e = _term()
while (substr(_S_expr,_f,1) ~ /[+-]/)
e = substr(_S_expr,_f++,1) == "+" ? e + _term() : e - _term()
return e
}

function _term( e) { # factor | factor [*/%] factor
e = _factor()
while (substr(_S_expr,_f,1) ~ /[*\/%]/) {
_f++
if (substr(_S_expr,_f-1,1) == "*") return e * _factor()
if (substr(_S_expr,_f-1,1) == "/") return e / _factor()
if (substr(_S_expr,_f-1,1) == "%") return e % _factor()
}
return e
}

function _factor( e) { # factor2 | factor2^factor
e = _factor2()
if (substr(_S_expr,_f,1) != "^") return e
_f++
return e^_factor()
}

function _factor2( e) { # [+-]?factor3 | !*factor2
e = substr(_S_expr,_f)
if (e~/^[\+\-\!]/) { #unary operators [+-!]
_f++
if (e~/^\+/) return +_factor3() # only one unary + allowed
if (e~/^\-/) return -_factor3() # only one unary - allowed
if (e~/^\!/) return !(_factor2()+0) # unary ! may repeat
}
return _factor3()
}

function _factor3( e,fun,e2) { # number | varname | (expr) | function(...)
e = substr(_S_expr,_f)

#number
if (match(e,/^([0-9]+[.]?[0-9]*|[.][0-9]+)([Ee][+-]?[0-9]+)?/)) {
return _advance()
}

#function()
if (match(e,/^([A-Za-z_][A-Za-z0-9_]+)?\(\)/)) {
fun=_advance()
if (fun~/^srand()/) return srand()
if (fun~/^rand()/) return rand()
printf("error: unknown function %s\n", fun)
return 0
}

#(expr) | function(expr) | function(expr,expr)
if (match(e,/^([A-Za-z_][A-Za-z0-9_]+)?\(/)) {
fun=_advance()
if (fun~/ ^((cos)|(exp)|(int)|(log)|(sin)|(sqrt)|(
srand))?\(/) {
e=_expr()
e=_calcfun(fun,e)
}
else if (fun~/^atan2\(/) {
e=_expr()
if (substr(_S_expr,_f,1) != ",") {
printf("error: missing , at %s\n", substr(_S_expr,_f))
return 0
}
_f++
e2=_expr()
e=atan2(e,e2)
}
else {
printf("error: unknown function %s\n", fun)
return 0
}
if (substr(_S_expr,_f++,1) != ")") {
printf("error: missing ) at %s\n", substr(_S_expr,_f))
return 0
}
return e
}

#variable name
if (match(e,/^[A-Za-z_][A-Za-z0-9_]*/)) {
return _vars[_advance()]
}

#error
printf("error in factor: expected number or ( at %s\n", substr(_S_expr,_f))
return 0
}

function _calcfun(fun,e) { #built-in functions of one variable
if (fun=="(") return e
if (fun=="cos(") return cos(e)
if (fun=="exp(") return exp(e)
if (fun=="int(") return int(e)
if (fun=="log(") return log(e)
if (fun=="sin(") return sin(e)
if (fun=="sqrt(") return sqrt(e)
if (fun=="srand(") return srand(e)
}

function _advance( tmp) {
tmp = substr(_S_expr,_f,RLENGTH)
_f += RLENGTH
return tmp
}

Re: - dbcat (2006年04月15日 22時03分12秒)

以下のような方法でもできます。

echo "1+2+3"| xargs -i awk 'BEGIN{print {}}'

または、

$ echo "1+2*(2+1.1)
> sin(1)+exp(2)
> 3%5-cos(1.2-3.4)" |awk '{a=$0;cmd="awk \047BEGIN{print "$0" }\047";cmd|getlin\
e ;close(cmd);print a"="$0}'

1+2*(2+1.1)=7.2
sin(1)+exp(2)=8.23053
3%5-cos(1.2-3.4)=3.5885

のようなトリッキーなものはどうでしょうか?

Re: - dbcat (2006年04月15日 22時05分31秒)

以下のようなものを作ってみました。

#! /usr/bin/awk
# by dbcat
# GNU Awk 3.1.4


BEGIN{
# TEST
eval("2.1+sin(1.1-log(23))")
eval("1*1*1")
eval(pp(1)+1)
}


function eval(cmd,expression)
 {
  expression = "awk \047BEGIN{print "cmd" }\047"
  system(expression)
 }



function pp(x)
 {
    return cos(sin(x))
 }

{{comment multi|w}}

Compare 2 files - Mag Gam (2006年04月15日 21時49分07秒)

File1:

red
blue
green
orange

File2:

black
white
red
blue

ような 2 つのファイルがあります。これを比較して、以下のような結果を得ようとしています。

red exists in file2
blue exists in file2
green does NOT exist in file2
orange does NOT exist in file2

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/b125de3907697ad9/bbdcfb11e3fb4d31?hl=ja#bbdcfb11e3fb4d31


Re: - Harlan Grove (2006年04月15日 21時50分07秒)

File2 を配列で読み込みます。

awk 'FNR == NR { a[$0]; next }
{ print $0 (($0 in a) ? " exists " : " does NOT exist ") "in file2" }'
file2 file1

もちろん、こうやるよりも cmp を使うのが良いでしょう。

Re: - Eric Pement (2006年04月16日 23時37分20秒)

この場合は cmp ではなく、comm が良いです。

  sort file1 >file1.srt
  sort file2 >file2.srt
  comm -2 file1.srt file2.srt

もしも必要なら sed か awk で整形します。

  comm -2 file1.srt file2.srt | awk '
  /^\t/ {sub(/$/, " exists in file2");print;next;}
  {sub(/$/, " does NOT exist in file2");print;}'

{{comment multi|w}}

capturing shell output - dot (2006年04月15日 21時45分34秒)

count = system("./munge-data.sh " $1 )

というのを行い、スクリプトの exit コードを得ようとしても得られません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/6ab8f72057d18801/0451993983e4c1a3?hl=ja#0451993983e4c1a3


Re: - Patrick TJ McPhee? (2006年04月15日 21時47分00秒)

 cmd = "./munge-data.sh " $1
 cmd | getline count
 close(cmd)

というようにして用います。

または、

 cmd = "./munge-data.sh " $1
 while ((cmd | getline) > 0) {
     # data is in $0, $1, $2, etc
 }
 close(cmd)

のようにしてループを作ることもできます。

{{comment multi|w}}

beta release of XMLgawk available - Juergen Kahrs (2006年04月10日 00時52分11秒)

翻訳したものが、ここにありますので、参照してください。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/01480688c93c8024/be8866ccf113eb50?hl=ja#be8866ccf113eb50


{{comment multi|w}}

dynamic command - jerome (2006年04月08日 01時05分44秒)

ksh の中の awk スクリプトでダイナミックに引数を変更することができますか?

...tab[substr($0, 100, 3)substr($0, 200, 5)]...

のような部分がありますが、この "100,3" "200,5" をダイナミックに変更したいのです。

ENVIRON を使ってみましたがうまく動作しませんでした。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/90310f3a1e365463/a5b5596b8e1ee1ea?hl=ja#a5b5596b8e1ee1ea


Re: - Ed Morton (2006年04月08日 01時06分20秒)

awk -v start=50 -v lgth=5 '{...substr($0,start,lgth)...}'

Re: - patrick (2006年04月08日 01時08分09秒)

2 つのカンマで区切られたものだとうまくいかないと思います。

Re: - Ed Morton (2006年04月08日 01時08分34秒)

awk -v start1=50 -v lgth1=5 -v start2=10 -v lgth2=7
'{...substr($0,start1,lgth1)...; ...substr($0,start2,lgth2)...}'

のようにするか、

awk -v s1s="50,5 10,7" '
BEGIN{  c=split(sls,slsA)
  for (i=1;i<=c;i++) {
    split(slsA[i],slA,",")
    start[i]=slA[1]
    lgth[i]=slA[2]
  }
{...substr($0,start[1],lgth[1])...; ...substr($0,start[2],lgth[2])...}'

のようにする必要があります。

{{comment multi|w}}

blank line at top when awk finishes - enrique (2006年04月08日 01時00分57秒)

なぜ awk の最初の行に空行が入るのでしょうか?

そのために面倒なことをやっています。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/c8270e755b1482fa/9e0f025da83b85d4?hl=ja#9e0f025da83b85d4


Re: - Chris F.A. Johnson (2006年04月08日 01時02分24秒)

コードを見せてもらわないと何とも言えませんが、多分コードが間違っています。

{{comment multi|w}}

is there anything wrong with the regexp? - hi_saito (2006年04月06日 23時47分16秒)

4 桁の数を取得しようと思い、以下のようなスクリプトを書きました。

{
 if ($0 ~ /[0-9]{4}/)
   print $0
}

でも、所望のものが得られません。

どうしてでしょうか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/29964065bda3918e/63694e3833764bf5?hl=ja#63694e3833764bf5


Re: - Harlan Grove (2006年04月06日 23時48分17秒)

マニュアルを読みましたか?

そのまま引用しますと、

"However, because old programs may use { and } in regexp constants, by
default gawk does not match interval expressions in regexps.  If
either --posix or --re-interval are specified (see Command-Line Options),
then interval expressions are allowed in regexps."

{{comment multi|w}}

GAWK.DLL cannot open include file itsctrl.h - Lucy (2006年04月06日 23時45分36秒)

gawkint.c を Visula C++ で作ろうとしています。

しかし、itsctrl.h がオープンできません。

これはどこにありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/86a2de14ee558577/8dcaddec7131f91b?hl=ja#8dcaddec7131f91b


Re: - news.t-online.de (2006年04月09日 02時34分26秒)

gawk.dll は Windows 3.1 用にできたもので、最新の Windows 用のものではありません。

{{comment multi|w}}

simple function not working as expected - tomv5001 (2006年04月06日 23時38分17秒)

#!/bin/sh
cat tempfunct.txt |\
awk '{
func myprint(num)
{ printf "%6.3g\n", num }
if ($1>0) { myprint($1) }
}'

というスクリプトがあり、

1 5 23 8 16
44 3 5 2 8 26
256 291 1396 2962 100
-6 467 998 1101
99385 11 0 225

のような tempfunct.txt があります。

期待する結果は、

1
44
256
9.94e+04

なのですが、全て 0 になってしまいます。

どうしたらいいでしょうか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/db58d88ad2e2d99b/dc21b39d3d27500b?hl=ja#dc21b39d3d27500b


Re: - news.t-online.de (2006年04月06日 23時39分10秒)

awk '
 function  myprint(num) {
     printf "%6.3g\n", num
 }
 {if ($1>0)  myprint($1) }
 '

を試してみてください。

Re: - Chris F.A. Johns (2006年04月06日 23時40分23秒)

awk '
func myprint(num)
{ printf "%6.3g\n", num }
{
 if ($1>0) { myprint($1) }
}'

を試してみてください。

Re: - tomv5001 (2006年04月06日 23時41分39秒)

以下のようなスクリプトにしたら、エラーになりました。

#!/bin/sh
cat temp1.txt |\
awk '
func myprint(num)
{ printf "%6.3g\n", num }
{
 if ($1>0) { myprint($1) }'

Re: - tomv5001 (2006年04月06日 23時43分52秒)

Solaris を使っていますが、nawk だと動作しました。

{{comment multi|w}}

How to extract hrefs and their locations from html - runnig (2006年04月06日 00時38分55秒)

awk を使って HTML から HTML のリファレンスを抜き出すことはできますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/901c567b835c1fe3/a31b363d6a794a98?hl=ja#a31b363d6a794a98


Re: - Juergen Kahrs (2006年04月06日 00時40分15秒)

XHTML であれば、XML のツールが使えます。ググってみて、気に入るのがなければ、以下の xgawk を使ってみてください。

{{comment multi|w}}

begginer printf problem - tomv5001 (2006年04月05日 00時51分52秒)

"15.9M        "

が欲しいのですが、

{ printf "%-12.1fM", 15946980/1000000 }

とすると

"15.9        M"

になります。

どうすればいいですか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/50a434162cd02755/46ad9932624d3794?hl=ja#46ad9932624d3794


Re: - Harlan Grove (2006年04月06日 00時37分32秒)

単にマイナス (-) を除けば OK です。左寄せにしたい場合には、

printf "%-12s", sprintf("%.1fM", 15946980/1000000)

のようにします。

{{comment multi|w}}

awk question - rogv24 (2006年04月05日 00時48分43秒)

date コマンドを打ち込んだら、"April 3" と出ました。

これを "April 03" にするにはどうすればいいですか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/d8dd2b80c5d2db37/0548d3191f4d3c65?hl=ja#0548d3191f4d3c65


Re: - Ed Morton (2006年04月05日 00時49分11秒)

これは date コマンドの質問のように聞こえますね。

Re: - rogv24 (2006年04月05日 00時49分53秒)

以下のように date を行って解決しました。

date '+ %b %d'  > mydate

{{comment multi|w}}

gawk.dll examples - Sandra (2006年04月04日 00時23分08秒)

gawk.dll を使おうとしていますが、あまり dll に精通していません。どこで、Visual C のサンプルプログラムが入手できますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/d18faf11bb5afc13/4b512a8fa8cd3661?hl=ja#4b512a8fa8cd3661


Re: - Brian Inglis (2006年04月04日 00時24分15秒)

つ http://www.walkerj.de/GAWKDLL/gawkdll.txt

マニュアル嫁。(意訳だけど、こんなところか?)

{{comment multi|w}}

Awk to match two conditions - bshah (2006年04月01日 23時09分14秒)

21516 desno10522 tcos7855 lis7255 fla7018 dusdsd6640 ant6580 kfddg6462 megfi6432 lnic

のようなファイルがあり、最初のフィールドが 50 から 350 にマッチして、2 番目のフィールドが [a-d]* or [l-q]* というものを見つけたいのですが、やり方が分かりません。

awk '$1 >= 50 && $1 <= 350 { total+=$1;print $2} END { print total "
MB" > "/dev/tty" }' INPUT_FILE> OUTPUT_FILE

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/404256ec7a4a6454/d8ac5d6c475aa1eb?hl=ja#d8ac5d6c475aa1eb


Re: - Janis Papanagnou (2006年04月01日 23時09分56秒)

以下のようなことをやりたいのでしょうか?

$1 >= 50 && $1 <= 350  &&  $2 ~ /^[a-dl-q]/  { ... }

{{comment multi|w}}

awk to separate records - bshah (2006年03月31日 00時38分27秒)

test.log には以下のように記載されています。

xxxx Password expiration date: Tue Mar 27 09:00:59 PST 2007 Last
password change: Mon MAR 27 09:00:59 PST 2006

ここで欲しい出力は以下のようなものです。

xxxx | date: Tue Mar 27 09:00:59 PST 2007
awk '{print $1, $4,$5,$6,$7,$8,$9,$10}' test.log

とやってみましたが、

xxxx date: Tue Mar 27 09:00:59 PST 2007

となり | で区切られません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/646b6ce65532abbb/5f2d6746b0025b1c?hl=ja#5f2d6746b0025b1c


Re: - Janis Papanagnou (2006年03月31日 00時39分07秒)

awk '{print $1,"|",$4,$5,$6,$7,$8,$9,$10}'

とすればいいのです。

Re: - Grant (2006年03月31日 00時39分36秒)

awk '{print $1 "  | " $4,$5,$6,$7,$8,$9,$10}' test.log

としてみてください。

{{comment multi|w}}

spider or rose diagram - durant (2006年03月29日 23時33分11秒)

X,Y,ANGLE,DISTANCE という入力ファイルがあります。これを X, Y と DISTANCE から ANGLE を計算したいのです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/a1f7a712f8288354/0e680bc2c83a6205?hl=ja#0e680bc2c83a6205


Re: - mickey (2006年03月29日 23時33分48秒)

X=Distance*Cos(theta)
y=distance*Sin(theta)

とすればできますよ。

Re: - mickey (2006年03月29日 23時34分34秒)

原点が 0 とは限らないので、以下のようになります。

X' = X + Distance * Cos(theta)
Y' = Y + Distance * Sin(theta)

Re: - durant (2006年03月31日 00時26分46秒)

以下のような入力です。

API,X,Y,0,45,90,135,180,225,270,315
1,0,0,1,0,0,5,0,0,0,0
2,100,0,0,5,0,0,5,0,0,1
3,200,0,0,0,5,0,0,5,0,0

これを以下のようなスクリプトで処理してもうまくいきません。

if ($4 != 0){
   x = $2 + $4 * cos(0);
   y = $3 + $4 * sin(0);
   print $1","$2","$3","x","y;
}

Re: - Grant (2006年03月31日 00時28分29秒)

それは sin(x) は x が radian で、cos(x) は x が radian だから値を入れないと動きません。

Re: - durant (2006年04月01日 23時03分26秒)

これをプロットしようとして以下のようなものを作成しましたが、うまく動作しません。

#!s:\rdg\unixutil\usr\local\wbin\gawk -f
#
BEGIN{
  FS = ",";
  scalefactor = 1;
  pi = 3.141592654;
  print "API,X1,Y1,X2,Y2";
}
{
if ($1 != "API"){
  if ($4 != 0){
            x = $2 + $4 * cos(0*(pi/180));
                y = $3 + $4 * sin(0*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($5 != 0){
            x = $2 + $5 * cos(45*(pi/180));
                y = $3 + $5 * sin(45*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($6 != 0){
            x = $2 + $6 * cos(90*(pi/180));
                y = $3 + $6 * sin(90*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($7 != 0){
            x = $2 + $7 * cos(135*(pi/180));
                y = $3 + $7 * sin(135*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($8 != 0){
            x = $2 + $8 * cos(180*(pi/180));
                y = $3 + $8 * sin(180*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($9 != 0){
            x = $2 + $9 * cos(225*(pi/180));
                y = $3 + $9 * sin(225*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($10 != 0){
            x = $2 + $10 * cos(270*(pi/180));
                y = $3 + $10 * sin(270*(pi/180));
            print $1","$2","$3","x","y;
  }
  if ($11 != 0){
            x = $2 + $11 * cos(315*(pi/180));
                y = $3 + $11 * sin(315*(pi/180));
            print $1","$2","$3","x","y;
  }
}
}

Re: - mickey (2006年04月01日 23時04分22秒)

これを試してみてください。

  #!s:\rdg\unixutil\usr\local\wbin\gawk -f
  #
  BEGIN{
    FS = ",";
    scalefactor = 1;
    pi = 3.141592654;
    print "API,X1,Y1,X2,Y2";
  }
  {
  if ($1 != "API"){
   for(var=4; var<12, var++){
     if ($var != 0){
        x = $2 + $var * cos(((4-var)*45+90)*(pi/180));
        y = $3 + $var * sin(((4-var)*45+90)*(pi/180));
        print $1","$2","$3","x","y;
     }
    }
  }
}

{{comment multi|w}}

Delete records with two or more identical fields - Jonny (2006年03月29日 23時24分09秒)

112  544  667
233  654  233
786  786  897
234  546  877
102  548  548

というファイルがあって、これを同じフィールドがないものだけをピックアップしたいのです。

112  544  667
234  546  877

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/7c9b860271a96cca/01868cce9bd2d5ef?hl=ja#01868cce9bd2d5ef


Re: - Loki Harfagr (2006年03月29日 23時24分51秒)

$ awk 'BEGIN{i=0} {for(j=1;j<=NF;j++){if(a[$j]){delete(a); next};a[$j]=1} ; v[++i]=$0; delete(a)} END{while(i){print v[i--]}}' MISCFILES/dupfields.txt
234  546  877
112  544  667

のようにすれば可能です。

Re: - William James (2006年03月29日 23時25分31秒)

{ delete a
  for (i=1; i<=NF; i++)
    a[$i]
}
length(a) == NF

とすれば可能です。

Re: - Janis Papanagnou (2006年03月29日 23時26分58秒)

length() を配列に使うことはできるのですか?

Re: - William James (2006年03月29日 23時27分43秒)

awk95 でも使えます。

Re: - Ed Morton (2006年03月29日 23時29分04秒)

そうしたことを気にしないのであれば、

{ delete a; c=0
   for (i=1; i<=NF; i++)
     c += ++a[$i]
}
c == NF

とすれば OK です。

Re: - Janis Papanagnou (2006年03月29日 23時29分35秒)

以下のようにしてもできます。

{ for (i=1; i<=NF; i++) if ($i in a) next; else a[$i]; delete a } 1

Re: - Harlan Grove (2006年03月29日 23時30分37秒)

以下のようにしてもできます。

{ for (i = 1; i < NF; ++i) for (j = i + 1; j <= NF; ++j) if ($i == $j)

next; print }

Re: - Michael Zawrotny (2006年03月31日 00時25分33秒)

以下のようにしても可能です。

{
    delete a
    for( i = 1 ; i <= NF; i++ ) {
        a[$i]++;
        if ( a[$i] > 1 ) {
            next
        }
    }
    print
}

Re: - Harlan Grove (2006年03月31日 00時25分55秒)

以下のようにもできます。

{
  delete a
  for( i = 1 ; i <= NF; i++ ) if (a[$i]++) next
  print
}

{{comment multi|w}}

Manipulating dates - mickey (2006年03月29日 23時20分09秒)

27-Sep-2001 といった dd-mmm-yyyy という形式の変数があり、これを 1-Jan-1999 といった他の日にちにすることは gawk でできますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/0a4aae31ac848468/65cc957c7dece054?hl=ja#65cc957c7dece054


Re: - Ed Morton (2006年03月29日 23時21分26秒)

以下のようにしてできます。

function cvttime(t,     a) {
         split(t,a,"[/:]")
         match("JanFebMarAprMayJunJulAugSepOctNovDec",a[2])
         a[2] = sprintf("%02d",(RSTART+2)/3)
         return( mktime(a[3]" "a[2]" "a[1]" "a[4]" "a[5]" "a[6]) )
}
BEGIN{
t1="01/Dec/2005:00:04:42"
t2="01/Dec/2005:17:14:12"
print cvttime(t2) - cvttime(t1)
}

{{comment multi|w}}

Working with Ham Radio Call Signs - Jeff Kloek (2006年03月26日 23時46分10秒)

アマチュア無線 (ham) のコールサインを整理するスクリプトを作っています。

コールサインは以下のとおりです。

AC4CU
WA4MFF
K3LK
NF5B

これを

AC4    tab    CU
WA4    tab    MFF
K3       tab    LK
NF5    tab    B

のようにしたいです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/6e338bd28a12f38b/f0321835a7fd1ff0?hl=ja#f0321835a7fd1ff0


  • 以下のようにします。 - William James (2006年03月26日 23時48分00秒)
awk '{print substr($0,1,match($0,/[0-9]/)), "\t",
 substr($0,RSTART+1)}' old >new

また、使っているのが Windows なら

awk "{print substr($0,1,match($0,/[0-9]/)), \"\t\",substr($0,RSTART+1)}"

のようにします。

  • awk よりも sed の方が便利ですよ。 - Chris F.A. Johnson (2006年03月26日 23時49分22秒)
sed 's/[0-9]/&\t/'
  • 以下のようにします。 - Janis Papanagnou (2006年03月26日 23時50分36秒)
  awk '{match($0,/.*[0-9]/);
        printf("%s\t%s\n",substr($0,1,RLENGTH),substr($0,RLENGTH+1))}'

または、

awk 'sub(/[0-9]/,"&\t")'

{{comment}}


  • そういえば、私が最初に作った awk スクリプトもアマチュア無線関係のスクリプトでした。当時の無線パケット通信で流したっけなぁ。 - hi_saito (2006年03月26日 23時47分05秒)

Help with line extraction - rhuston (2006年03月26日 23時41分26秒)

ここから取得した Windows 用 gawk を使っています。

awk 'substr($0,p,3)=="ISS" {
 print substr($0,1,p-1) "   " substr($0,p+3)}' p=87 oldfile >new

というプログラムを動かしましたが、

awk: syntax error at source line
context is
>>> ' <<<
awk: bailing out at source line 1

というエラーになります。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/4b0ccf87f7eab4c7/42094112a1915937?hl=ja#42094112a1915937


  • awk の Windows 版を使っているからだと思います。自分のプログラムを gawk -f で走らせてみてください。 - Janis Papanagnou (2006年03月26日 23時43分09秒)

Re: - Patrick TJ McPheePatrick? TJ McPhee? (2006年03月29日 23時16分13秒)

substr($0,p,3)=="ISS" {
  print substr($0,1,p-1) "   " substr($0,p+3)
}

というプログラムを作って以下のように動作させてみてください。

awk -f subst.awk p=87 oldfile > newfile

{{comment multi|w}}

[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ]


最終更新時間:2007年07月30日 22時13分35秒