コミュニティ/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

お名前
件名
本文

Mailing based on the condition - gopikrishnan.gunasekaran (2006年02月12日 01時43分10秒)

scenario という awk コマンドで第 2 フィールドをチェックしています。この第 2 フィールドが 80 以上の場合に、メールを出すことは可能ですか?

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


  • 既に回答しています。 - Janis Papanagnou (2006年02月12日 01時43分36秒)

{{comment}}

which gawk to gawk co-process or service? - Grant (2006年02月12日 01時37分50秒)

データベースを読み込む時間を短縮するのに、サービスとしてデータベースを走らせるか、コプロセスでデータベースを走らせることを考えています。

/inet/ を使う方法がありますが、データベースを読み込んだコプロセスに対してクエリを行いたいのですが、良い方法はありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/983b6417c8733d9b/decb5731b811f934?hl=ja#decb5731b811f934


  • それはやりすぎではないですか? 単に検索すればいいのではないですか? - Joe User (2006年02月12日 01時40分35秒)
  • 速度的な差があります。 - Grant (2006年02月12日 22時12分33秒)

サーバー/クライアント方式では、

root@deltree:~# time zcat /var/log/messages.1.gz | /usr/local/bin/junkview \
-v hours=0 netmin=24 netmax=28 hits=2 drop=0 showhits=10 debug=0 quiet=0 client=1
junkview v. 2006-02-11...
...
Reviewed 3624 records and examined 3624 to find 2105 events from deltree.
Settings: hours=0, prefix=InpDrop, bars=16, hits=2, netmin=24, netmax=28.
Reading: /home/share/junk/ip2country-names, success.

Top 10 hits by host:
   hits     host address        lookup netaddr code country
  -----  ---------------    ------------------  --  ----------------------
     43    204.16.208.67       204.16.208.0/22  US  United States
     37  220.240.114.185        220.240.0.0/16  AU  Australia
     32    220.240.8.132        220.240.0.0/16  AU  Australia
     28     60.11.125.39          60.11.0.0/16  CN  China
     28     207.46.98.43         207.46.0.0/16  US  United States
     23  220.240.112.185        220.240.0.0/16  AU  Australia
     22   222.141.69.129        222.136.0.0/13  CN  China
     21   220.240.158.88        220.240.0.0/16  AU  Australia
     21   219.146.161.10        219.144.0.0/13  CN  China
     20    61.132.254.60         61.132.0.0/16  CN  China

Top 10 hits by net:
   hits      lookup netaddr         net address code country
  -----  ------------------  ------------------  --  ----------------------
    295      220.240.0.0/16      220.240.0.0/16  AU  Australia
    105       221.14.0.0/15   221.14.246.224/27  CN  China
     70     68.142.192.0/18     68.142.248.0/22  US  United States
     59      66.249.64.0/19      66.249.64.0/21  US  United States
     48        60.11.0.0/16     60.11.125.36/30  CN  China
     43     204.16.208.0/22    204.16.208.67/32  US  United States
     40       207.46.0.0/16     207.46.98.42/31  US  United States
     36      222.136.0.0/13      222.136.0.0/13  CN  China
     32      220.239.0.0/16      220.239.0.0/16  AU  Australia
     32      219.144.0.0/13      219.146.0.0/15  CN  China

real    0m2.696s
user    0m1.720s
sys     0m0.120s

であり、普通に読み込むと

root@deltree:~# time zcat /var/log/messages.1.gz | /usr/local/bin/junkview \
-v hours=0 netmin=24 netmax=28 hits=2 drop=0 showhits=10 debug=0 quiet=0 client=0
junkview v. 2006-02-11...
...
Reviewed 3624 records and examined 3624 to find 2105 events from deltree.
Settings: hours=0, prefix=InpDrop, bars=16, hits=2, netmin=24, netmax=28.
Reading: /home/share/junk/ip2country..................... 71491 records.
Reading: /home/share/junk/ip2country-names, success.

Top 10 hits by host:
   hits     host address        lookup netaddr code country
  -----  ---------------    ------------------  --  ----------------------
     43    204.16.208.67       204.16.208.0/22  US  United States
     37  220.240.114.185        220.240.0.0/16  AU  Australia
     32    220.240.8.132        220.240.0.0/16  AU  Australia
     28     60.11.125.39          60.11.0.0/16  CN  China
     28     207.46.98.43         207.46.0.0/16  US  United States
     23  220.240.112.185        220.240.0.0/16  AU  Australia
     22   222.141.69.129        222.136.0.0/13  CN  China
     21   220.240.158.88        220.240.0.0/16  AU  Australia
     21   219.146.161.10        219.144.0.0/13  CN  China
     20    61.132.254.60         61.132.0.0/16  CN  China

Top 10 hits by net:
   hits      lookup netaddr         net address code country
  -----  ------------------  ------------------  --  ----------------------
    295      220.240.0.0/16      220.240.0.0/16  AU  Australia
    105       221.14.0.0/15   221.14.246.224/27  CN  China
     70     68.142.192.0/18     68.142.248.0/22  US  United States
     59      66.249.64.0/19      66.249.64.0/21  US  United States
     48        60.11.0.0/16     60.11.125.36/30  CN  China
     43     204.16.208.0/22    204.16.208.67/32  US  United States
     40       207.46.0.0/16     207.46.98.42/31  US  United States
     36      222.136.0.0/13      222.136.0.0/13  CN  China
     32      220.239.0.0/16      220.239.0.0/16  AU  Australia
     32      219.144.0.0/13      219.146.0.0/15  CN  China

real    0m6.274s
user    0m5.730s
sys     0m0.300s

となります。ファイルの中身は以下のようなものです。

BEGIN {
        if (!port) port = 7300
        ip2c_server = "/inet/tcp/" port "/0/0"
        if (!datapath) datapath = "/home/share/junk/"
        if (!datafile) datafile = (datapath "ip2country")
        read_ip2country()
        oldquery = query = "xyz"
        for (;;) {
                seq = ++seq % 100000
                printf "%05d ", seq
                ip2c_server |& getline query
                if (oldquery == query) {
                        close(ip2c_server)
                        continue
                }
                oldquery = query
                printf "%s -> ", query
                split(query, k, ".")
                addr = 0
                for (j = 1; j <= 4; j++) { # convert to binary addr
                        addr *= 256
                        addr += and(k[j], 255)
                }
                result = search_ip2country(addr)
                print result |& ip2c_server
                print result
        }
}

client lookup:
...
        ip2c_server = "/inet/tcp/0/localhost/7300"
...
function search_ip2country(a,   i, j, k, m, n, o)
{
        if (!!client) {
                print a |& ip2c_server
                if (debug > 1) printf "%20s ", a
                ip2c_server |& getline o
                if (debug > 1) print o
                return o
        }
...

詳細は、

に出ています。

mail command within awk - gopikrishnan.gunasekaran (2006年02月12日 01時30分32秒)

awk の中で mail コマンドを使いたいのですが、どうすればいいでしょうか?

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


  • よく分からないので、質問します。 - Ed Morton (2006年02月12日 01時31分10秒)
  1. 他にもっといい方法があるのではないですか?
  2. プラットフォームに依存しますので、comp.unix.shell などで質問された方が良いのではないですか?
  • 以下のような使用方法があります。 - Janis Papanagnou (2006年02月12日 01時33分15秒)
/some subject condition/ { subject = $4 }
/some recipient condition/ { addrlist = addrlist " " $1 }
/some content condition/ { print $5 $6 | "mailx -s " subject addrlist }

また、shell を使えば、

awk '/some content cond/ { print $5 $6 }' yourdata | mailx -s subj x@y.z

のようにもできます。

  • 以下のようなものを使っています。 - LC's NoSpam? Newsreading account (2006年02月17日 00時19分03秒)
 s="my own specific message on the condition"
 ne++
 mail(s)

のようにして、特定の状況が発生したら、フラグを立てます。

   function mail(string) { print string >> fil3  }

のような関数を用意して、

if (ne > 0) system("/usr/bin/mailx -s 'mysub' myaddr < "fil3" >/dev/null")

というのを BEGIN または END で指定しておけば、メールされます。

{{comment}}

Hex output too long for negative input - martin cohen (2006年02月09日 22時29分03秒)

printf("%8.8X", -1)

とした時に、Linux 上の gawk 3.1.3 では、

FFFFFFFFFFFFFFFF

と返ってきます。

8 文字に強制的にする方法はありますか?

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

  • 以下のようにして print します。 - Grant (2006年02月09日 22時29分34秒)
and(varname, 0xffffffff)

{{comment}}

extract fields 5 - NF - Geezer From The Freezer (2006年02月07日 00時59分07秒)

5 番目のフィールドから最後までの全てのフィールドを得るにはどうすればいいでしょうか?

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


  • ここに解答があります。 - Ed Morton (2006年02月07日 00時59分33秒)
  • 以下のようにすれば、どんな FS でも動作します。 - Harlan Grove (2006年02月08日 00時34分27秒)
awk '{
  t = $0
  if (FS == " ") { sub(/^[[:space:]]*/, "", t); fs = "[[:space:]]+" }
else fs = FS
  for (k = 1; k < n; ++k) if (match(t, fs)) t = substr(t, RSTART +
RLENGTH); else break
  if (k >= n) print t
}' FS=<whatever> n=5 inputfile
  • 少し変えてみました。以下の方が少し速いと思います。 - Ed Morton (2006年02月08日 00時35分37秒)
{ fs = FS; pat = "^" }
FS == " " { fs = "[[:space:]]+"; pat = "^[[:space:]]*" }
{ for (k=1;k<n;++k) pat=pat $k fs; sub(pat,"") }
k >= n

また FS が変わらないのであれば、

BEGIN{
     if (FS == " ") { fs = "[[:space:]]+"; sol = "^[[:space:]]*" }
     else { fs = FS; sol = "^" }
}
{ pat = sol; for (k=1;k<n;++k) pat=pat $k fs; sub(pat,"") }
k >= n
  • 以下のようにすることもできます。 - William James (2006年02月08日 00時37分21秒)
# Like split(), but preserves the matching substrings.
function shatter( s, shards, regexp )
{ gsub( regexp, "\1&\1", s  )
  return split( s, shards, "\1" )
}

function field_to_end( fld,       i, shards, out )
{ if ( " " == FS )
    shatter( $0, shards, "[ \\t]+" )
  else
    shatter( $0, shards, FS )
  for ( i = fld*2 - 1; i in shards; i++ )
    out = out shards[i]
  return out
}

{ print field_to_end( 5 ) }

{{comment}}

read pattern from file - ivodijkstra (2006年02月07日 00時54分49秒)

box1 door1
box2 door2
box3 door3
box4 door4
box5 door1
box5 door2
box5 door3

という tail の出力があります。

これから box と door のコンビネーションを見つけたいのです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/8fe0f977200de3fc/7c1a9c279cde7fdd?hl=ja#7c1a9c279cde7fdd


  • 以下のようにできます。 - Harlan Grove (2006年02月07日 00時55分15秒)
awk '
NR == FNR { for (i = 10; i >= 1; --i) s[i] = s[i - 1] }
NR > FNR  { p[FNR] = $0 }
END       { for (i = 1; i <= 10; ++i) if (s[i] in p) print s[i] }
' filetocheck patternfile

{{comment}}

Anything to convert awk to ksh? - Robert Peirce (2006年02月07日 00時51分40秒)

a2p はありますが、a2k で ksh スクリプトにすることはできますか?

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


  • awk と shell は違いすぎです。 - William Park (2006年02月07日 00時52分17秒)

{{comment}}

small pgm big pblm - jim (2006年02月07日 00時48分07秒)

xxx に該当するものが最後のフィールドだった場合にカウントします。

BEGIN{used = "xxx";sum = 0}
         {if ($NF == used
            sum = sum +1
            print $0}
END{print "num recs-----",sum}

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/2424ff4a58f205ff/3b5e63e626c39723?hl=ja#3b5e63e626c39723


  • 以下のようにしてできます。 - Jonathan Hankins (2006年02月07日 00時48分31秒)
% echo -e "foo xxx\nbar xxx\nbaz notxxx" | \
  awk 'BEGIN { used = "xxx"; sum = 0 }
       $NF == used { sum+=1 }
       { print }
       END { print "num recs-----", sum }'

foo xxx
bar xxx
baz notxxx
num recs----- 2
  • 以下のようにもできます。 - William James (2006年02月07日 00時49分45秒)
BEGIN { used = "xxx" }
$NF == used { sum++ }
END { print "num recs-----", sum }
"xxx" == $NF && ++sum
END { print "num recs-----", sum }

{{comment}}

returning variables to shell FROM awk - Lisa (2006年02月06日 00時13分55秒)

awk から shell へ変数を渡したいのです。

$AWK -v Type=$Type -v Station=$Station -v Function=$Function -v
Description=$Description '{
         if ( $1 ~ /^\#/ ) { next }             # ignore comments
         if ( $1 == "'${Port}'" ) {
                 Type = $2
                 Station = $3
                 Function = $4
                 Description = substr($0, match( $0, $5 ));
         }
}' ${Config} || ( $ECHO "$PROGRAM Error: Config File error" >&2 ; exit 3 )

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


  • そうすることはできません。 - Ed Morton (2006年02月06日 00時14分13秒)

また、awk は

condition { action }

と記載するので、

   awk ... -v port="$Port" '
   $1 ~ /^\#/ { next }             # ignore comments
   $1 == port {
       Type = $2
       Station = $3
       Function = $4
       Description = substr($0, match( $0, $5 ));
       }' ...

のように書きます。

  • 以下のようにします。 - James (2006年02月08日 00時32分54秒)
eval $($GREP -E -v "^#" ${Config} 2>/dev/null | $GREP -m1
"^${Program_Port}"
2>/dev/null | xargs printf "Port=%s; Type=%s; Station=%s; Function=%s;
Description=%s")

{{comment}}

How do I make a field selection inside a for loop? - theboards (2006年02月03日 23時49分27秒)

for FILE in `ls -1 /opt/bf/files/*.dat`
do
   vutil2 -info $FILE 2>/dev/null | grep -v "^$" | \
   nawk 'BEGIN {FS="\n"; RS=""; OFS="\t"}
   {  for(i=1; i<=NF; i++)
         '$i ~ /# of keys/ {print $i}'
   }'
done

というコードがあります。

/opt/bf/files/bacs.dat  [vision version 4]

# of records:            183040
# of deleted records:         0
file size:             16272384 (/opt/bf/files/bacs.dat)
file size:              7441920 (/opt/bf/files/bacs.vix)
total file size:       23714304
segment size:        2147482112
record size:                153 compressed
# of keys:                    2
user count:                   4

のような結果が得られますが、version 3 と 4 で結果が異なります。また以下のようなエラーも出ます。

nawk: syntax error at source line 3
context is
                >>>   <<<

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/ba30f87a7314a7d3/84200915300610fe?hl=ja#84200915300610fe


  • 指摘事項は以下のとおりです。 - Ed Morton (2006年02月03日 23時50分41秒)
  1. "ls -l" はファイル名ではなく、ファイル名などが書かれた行を取得します。なので、"for FILE in" には "ls -l" は必要ありません。
  2. $FILE をクォートしてはいけません。
  3. スクリプトの中でシングルクォートを使ってはいけません。
  • "The AWK Programming Language" に以下のように書かれています。 - Chris F.A. Johnson (2006年02月03日 23時56分30秒)
"If you have to search a big file to isolate a small
amount of data, use grep or egrep for the searching and
awk for the processing. If there are a large number of
substitutions [...], you might use a stream editor like
sed for that part. In other words, break the job into
separate pieces, and apply the most appropriate tool to
each piece."
-- "The AWK Programming Language"
  • 非常に分かりにくいのですが、以下のようにします。 - Ed Morton (2006年02月05日 01時59分53秒)

まず、

grep -v "^$" file

awk '!/^$/' file

と同じです。

--------------------
/opt/bf/files/aa.dat  [vision version 4]

# of records:                 1
file size:                 1024 (/opt/bf/files/aa.dat)
file size:                 1536 (/opt/bf/files/aa.vix)
total file size:           2560
segment size:        2147482112
record size:                 66 compressed
# of keys:                    2
user count:                   0
--------------------
/opt/bf/files/advn.dat  [vision version 3]

# of records:                 1
file size:                 1536
record size:                 10 compressed
# of keys:                    1
user count:                   2
--------------------
/opt/bf/files/barg.dat  [vision version 4]

# of records:           4717271
file size:           2147481600 (/opt/bf/files/barg.dat)
file size:           1013522944 (/opt/bf/files/barg.d01)
file size:           1594243072 (/opt/bf/files/barg.vix)
total file size:     4755247616
segment size:        2147481600
record size:               1399 compressed
# of keys:                   15
user count:                  10
--------------------

というのを準備します。

       ... grep -v "^$" | \
       nawk 'BEGIN {FS="\n"; RS=""; OFS="\t"}
       {  for(i=1; i<=NF; i++)
           $i ~ /# of keys/ {print $i}
       }'

これで "# of keys" のような初期テキストをプリントします。私はここで、以下のようにします。

nawk -F": *" '$1=="# of keys"{print $2}'

で、全体の shell スクリプトを書き換えます。

   for FILE in /opt/bf/files/*.dat
   do
      vutil2 -info "$FILE" 2>/dev/null |
      nawk -F": *" '$1=="# of keys"{print $2}'
   done
  • 以下のように考えられます。 - theboards (2006年02月07日 00時36分41秒)
         for FILE in /opt/bf/files/*.dat
         do
            vutil2 -info "$FILE" 2>/dev/null | grep "# of keys" | cut -d: -f2
         done | more
  • 以下のようにできます。 - William James (2006年02月07日 00時38分36秒)
Input: ---------
/opt/bf/files/aa.dat  [vision version 4]

# of records:                 1
file size:                 1024 (/opt/bf/files/aa.dat)
file size:                 1536 (/opt/bf/files/aa.vix)
total file size:           2560
segment size:        2147482112
record size:                 66 compressed
# of keys:                    2
user count:                   0
/opt/bf/files/advn.dat  [vision version 3]

# of records:                 1
file size:                 1536
record size:                 10 compressed
# of keys:                    1
user count:                   2
/opt/bf/files/barg.dat  [vision version 4]

# of records:           4717271
file size:           2147481600 (/opt/bf/files/barg.dat)
file size:           1013522944 (/opt/bf/files/barg.d01)
file size:           1594243072 (/opt/bf/files/barg.vix)
total file size:     4755247616
segment size:        2147481600
record size:               1399 compressed
# of keys:                   15
user count:                  10

Output: ---------
/opt/bf/files/aa.dat 2 1 66 2560
/opt/bf/files/advn.dat 1 1 10 1536
/opt/bf/files/barg.dat 15 4717271 1399 4755247616

Program ---------
/\[vision version [34]\]$/ { filename = $1 }
/# of records:/ { num_recs = $NF }
/file size:/ { file_size += $3 }
/record size:/ { rec_size = $3 }
/# of keys:/ {
  print filename, $NF, num_recs, rec_size, file_size
  file_size = 0
}
  • 以下のようにしてみましたが、うまくいきません。 - theboards (2006年02月07日 00時39分53秒)
for FILE in `ls -1 /opt/bf/files/*.dat`
do
   vutil2 -info "$FILE" 2>/dev/null | grep -v "^$" | \
   nawk 'BEGIN {FS="\n"; RS=""; OFS="\t"}
      /\[vision version [34]\]$/ { filename = $1 }
      /# of records:/ { num_recs = $NF }
      /file size:/ { file_size += $3 }
      /record size:/ { rec_size = $3 }
      /# of keys:/ { num_keys = $NF }
      { print filename, num_keys, num_recs, rec_size, file_size;
file_size = 0}'
done
        user count:                   0 user count:                   0
file size:                 1024 (/opt/bf/files/aa.dat)  0
        user count:                   0 user count:                   0
file size:            101370880 (/opt/bf/files/aac.dat) 0
        user count:                   0 user count:                   0
file size:                 1024 (/opt/bf/files/aac2.dat)        0
        user count:                   0 user count:                   0
file size:                11776 (/opt/bf/files/aacb.dat)        0
        user count:                   0 user count:                   0
file size:            508531712 (/opt/bf/files/aacip.dat)       0
        user count:                   0 user count:                   0
file size:                 2048 (/opt/bf/files/aacr.dat)        0

ファイル名が空の場合にうまく動作していないようです。

  • 例えば以下のようにします。 - Ed Morton (2006年02月07日 00時41分42秒)
    for FILE in /opt/bf/files/*.dat
    do
       vutil2 -info "$FILE" 2>/dev/null |
       nawk -F": *" '
   NR==1             { fileName = $1 }
   $1=="# of keys"   { numKeys = $2 }
   $1=="record size" { recordSz = $2 }
   $1~/file size$/   { fileSz = $2 }
        END { print fileName, numKeys, recordSz, fileSz }
      '
    done
  • ようやく思っていたものが完成したようです。 - theboards (2006年02月07日 00時42分32秒)
for FILE in `ls -1 /opt/bf/files/*.dat`
do
vutil2 -info "$FILE" 2>/dev/null |
nawk 'BEGIN {OFS="\t"}
     /\[vision version [34]\]$/ { filename = $1 }
     /# of records:/ { num_recs = $NF }
     /file size:/ { file_size += $3 }
     /record size:/ { rec_size = $3 }
     /# of keys:/ { num_keys = $NF }
     END {print filename, num_keys, num_recs, rec_size, file_size;
file_size=0}'
done | more
  • 以下のようにしました。 - theboards (2006年02月08日 00時31分11秒)
for FILE in /opt/bf/files/*.dat
do
vutil2 -info "$FILE" 2>/dev/null |
nawk 'BEGIN {OFS="\t"}
     /\[vision version [34]\]$/ { filename = $1 }
     /# of records:/ { num_recs = $NF }
     /file size:/ { file_size = $NF }
     /record size:/ { rec_size = $3 }
     /# of keys:/ { num_keys = $NF }
     END {print filename, num_keys, num_recs, rec_size, file_size}'
done

{{comment}}

nawk: illegal field $( ) - dhsvm (2006年02月03日 23時42分58秒)

バイナリの出力をさせるプログラムを考えています。

以下のスクリプトを走らせると、'nawk: illegal field $( )' というエラーになります。

set StreamNetworkFile = ${argv[1]}
set InitialDepth = ${argv[2]}
set OutputDate = ${argv[3]}
shift

# Set the width for each channel class (numbered 1,2,3,...,n):

set width = 1.5,2.,3.,5.,2.,5.,7.5,10.,15.

nawk -v W=$width 'BEGIN{ split( W, WARRAY, "," );}{LENGTH = $4; VOL =
WARRAY[$5]*LENGTH*$InitialDepth; print $1, VOL;}' $StreamNetworkFile >!
../modelstate/Channel.State.$OutputDate

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/a33a45ee5df7b31f/02fe547df269bc88?hl=ja#02fe547df269bc88


  • 標準の UNIX の awk には 0 バイトのデータは扱えません。xpg4 の awk か gawk を使ってみてください。 - Juergen Kahrs (2006年02月03日 23時45分24秒)

{{comment}}

evaluation of logical expression - styx (2006年02月02日 22時35分19秒)

TABLE というものの中には論理表記で以下のように記載されています。

MYTEST[i]="a==100"

またアクションはテーブルに格納されています。

MYACTION[j]="print ok"

ここで以下のようなものを得たいのです。

if (TABLE[i]) MYACTION[j]

アクションには awk の組み込み関数のみを使っています。

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


  • 大体こんな感じという部分だけ書いておきます。 - Ed Morton (2006年02月03日 23時35分36秒)
awk -vsq=\' '
BEGIN { printf "awk %s", sq > "tool" }
{ sub(/\"$/,"") }
sub(/MYTEST\[i\]=\"/,"")   { printf "%s {", $0 > "tool" }
sub(/MYACTION\[j\]=\"/,"") { printf "%s }", $0 > "tool" }
END { printf "%s data\n", sq > "tool" }' config
  • 実は以下のようになっています。 - styx (2006年02月03日 23時37分09秒)
<label>:<test>:<action>

のようになっており、

rule1:a=="100":print "OK"

のようなものです。

  • awk だと難しいので、shell などの eval を使うのが妥当だと思います。 - Ed Morton (2006年02月03日 23時38分40秒)
  • QTAWK を見てみてはどうでしょう? - Terry D. Boldt (2006年02月03日 23時40分10秒)
  • 最近の gawk でサポートされている以下のコマンドがサポートされていないようです。 - William James (2006年02月06日 00時08分26秒)
tolower()
toupper()
nextfile

{{comment}}

parse a file and extracting only needed lines below some delimiter - Rosa (2006年02月02日 22時29分07秒)

mydoc.txt は以下のようになっています。

in favour of when I sat down at a very long,
now and then, in a kind of smile; his frame shivering,

----- Original Message -----

This is the content which I need to filter out . I dont need the above
paragraph.
anycontent can be here below...:

これを以下のようにしたいのです。

******************************
This is the content which I need to filter out . I dont need the above
paragraph.
anycontent can be here below...:
****************************

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


  • 以下のようにします。 - Lawson Hanson (2006年02月02日 22時29分33秒)
/----- Original Message -----/ { flag = 1 }
{ if (flag > 0) print}

また、"----- Original Message -----" の部分が必要ないのであれば、以下のようにします。

{ if (flag > 0) print}
/----- Original Message -----/ { flag = 1 }
  • 以下のようにしてできます。 - Ed Morton (2006年02月02日 22時41分04秒)
awk '/----- Original Message -----/{found=1}found' file
  • 欲しいのは以下の部分だけです。 - Rosa (2006年02月03日 23時33分20秒)
rest content1
rest content2
  • それなら以下のものでできます。 - Ed Morton (2006年02月03日 23時34分05秒)
awk 'found;/----- Original Message -----/{found=1}' file

{{comment}}

removing the first 15 characters from a string - landre (2006年02月02日 22時21分29秒)

ファイル名から最初の 15 文字を削除したいのです。

for i in `ls *.DAT`
do
mv $i `echo $i | awk -F_ '{print $2}'`
done

ファイル名に "_" が 1 つしかないときにはうまく動作するのですが、ファイル名に "20060131035927_" のようなものが付くとうまく動作しません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/175de607790e6385/f68e6dea0e8c768f?hl=ja#f68e6dea0e8c768f


  • comp.lang.awk の話題ではないのですが、以下のようにしてできます。 - Ed Morton (2006年02月02日 22時22分22秒)
for i in *.DAT
do
    mv "$i" "${i#???????????????}"
done
  • 以下のようにしてできます。 - Janis Papanagnou (2006年02月02日 22時23分15秒)
for i in *.DAT
do
   mv -i "$i" "${i#*_}"
   # the -i avoids clashes that often happen when removing timestamps
done

awk でやるのであれば、substr($0,16) のようにするか、sub(/[^_]*_/,"") のようにすればできます。

  • awk は必要ありません。 - hris F.A. Johns (2006年02月02日 22時25分03秒)
mv "$i" "${i#???????????????}"

とすればいいのです。

{{comment}}

extra paragraph between string & string2 - Anthony Greene (2006年02月02日 02時01分26秒)

sed 以外でやるには?

$ echo "blah blah begin this is a test 123 end blah blah"
| sed 's/.*\(th.*\)en.*/\1/'
this is a test 123

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/645a45048d2c296d/5b7f943f7dee038a?hl=ja#5b7f943f7dee038a


  • 以下のようにできます。 - Harlan Grove (2006年02月02日 22時18分17秒)
awk '{ s = substr($0, index($0, "begin") + 5); print substr(s, 1,
index(s, "end") - 1) }'

{{comment}}

extract paragraph between strings excluding the begin and end - markf900 (2006年02月02日 01時58分25秒)

begin と end の間にマッチする部分を抜き出したいのです。

echo "blah blah begin this is a test 123 end blah blah"  | <something?>

どうすればいいのでしょうか?

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


  • 以下のようにします。 - Chris F.A. Johnson (2006年02月02日 01時59分01秒)
 awk '{ split($0,a,"begin")
        split(a[2],b,"end")
        print b[1] }'

{{comment}}

system doesn't work ? - patrick (2006年02月02日 01時52分05秒)

Solaris で

INPUTFILE=myfile
awk '{
    printf "%s\n", $0
    system ("echo test")
}' $INPUTFILE

というのを作成しましたが、system が動作しません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/918151c899debcb1/343a26f1d7a7a5ba?hl=ja#343a26f1d7a7a5ba


  • man awk をしてみれば分かりますが、system はありませんよ。 - gerryt@ (2006年02月02日 01時52分39秒)
  • nawk を使う前に、/usr/xpg4/bin/awk を試してみてください。 - Ed Morton (2006年02月02日 01時53分29秒)

また、

awk 'BEGIN{print "echo yes" | "sh";exit}'

のようにすることができます。

{{comment}}

Need to Parse Log Files That Are Spread Across Two Lines Per Entry - Vadmin (2006年02月01日 00時42分40秒)

User=unknown, Auth=0 [None], Server=192.168.1.2:8080, Time=01/29/2006
06:00:00, Duration=18:01:02, Transfer=5528910
Source=192.168.200.200:2142, Destination=10.10.10.1:3222,
Connection=TCP Proxy, ACL=default:2

User=unknown, Auth=0 [None], Server=192.168.1.3:8080, Time=01/29/2006
01:23:36, Duration=22:37:26, Transfer=7273894
Source=192.168.200.122:1467, Destination=10.10.12.3:3334,
Connection=TCP Proxy, ACL=default:2

これで実際の IP アドレスとポート No. はどうやれば分かりますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/82bd6feeaa0796ea/64231c978527f752?hl=ja#64231c978527f752


  • 上記のフォーマットが決まっているのであれば、以下のようにします。 - Ed Morton (2006年02月01日 00時43分44秒)
awk -v RS= -F'(, |\n)' '$3 ~ /^Server=192.168.1.3:/' file
    awk -v RS= -F'(, |\n)' '
    $3 ~ /^Server=192.168.1.3:/ {
        split($7,s,"[=:]")
        split($8,d,"[=:]")
        printf "%s: %s %s: %s Port: %s\n", s[1],s[2],d[1],d[2],d[3]
    }' file
  • RS, split(), getline, や printf を使う必要はありません。 - William James (2006年02月02日 01時50分04秒)
BEGIN { FS = "[=:, ]+" }
flag { print "Source:", $2, "Destination:", $5, "Port:", $6 }
{ flag = /Server=192\.168\.1\.3/ }
  • これでもできます。 - Bill Seivert (2006年02月02日 22時17分07秒)
/User=/ {server=substr($0,index($0,"Server=")+7); sub (/:.*/,"",server)}
/Source=/ {if (server=="192.168.1.3") {
    # Extract source, destination and port from $0 and format to suit.
    }
  }

{{comment}}

Numeric test behaves differently in Linux and Cygwin - Martin (2006年01月30日 23時58分25秒)

awk ' (( $1+0 == $1 )) {print $1, $2, $3}' < input

というのを使って、数値出力させています。

Cygwin ではうまく動作するのですが、Ubuntu 5.10 では $1 が整数であることが必要とされます。

つまり、44 であって、0.44 ではないのです。

同じ gawk 3.1.4 なのに何が違うのでしょう?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/278ec7ca258d78d2/f5af1fafa01404f5?hl=ja#f5af1fafa01404f5


  • 以下のような意味でしょうか? - Kenny McCormack? (2006年01月30日 23時58分54秒)
$1 ~ /^[0-9.]+$/
  • これはロケールの問題ではないでしょうか? - Juergen Kahrs (2006年01月30日 23時59分34秒)
 > locale
LANG=POSIX
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE=POSIX
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

という部分を比較してみてください。

  • 3e04 とかは数字じゃないのですか? 1,024 とか -7 とかは? - Ed Morton (2006年02月01日 00時39分15秒)
  • これを試してみてください。 - Terry D. Boldt (2006年02月02日 01時47分33秒)
awk ' (( $1+0.0 == $1 )) {print $1, $2, $3}' < input

浮動小数点と整数の両方で出ます。

awk ' (( ($1+0.0 == $1) || ($1+0 == $1) )) {print $1, $2, $3}' < input

{{comment}}

join columns into single column - enda_ridge (2006年01月30日 23時53分31秒)

#******************
# COmments
# Headings for columns
#**************************
Col1_val  Col2_val  Col3_val  Col4_val  Col5_val

のようなフォーマットを Cygwin で使っています。

  1. コメント行をスキップする
  2. 1 つのコラムのデータにする

500 行もあっても可能ですか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/3f78ee702493f79b/f37f3c0a9cdd6ef8?hl=ja#f37f3c0a9cdd6ef8


  • まず、コメント行をスキップするには以下のようにします。 - Ed Morton (2006年01月30日 23時53分56秒)
awk '/^#/{next}1' file

またつなげるには以下のようにします。

awk '{print $X $Y}' file1 > file2

このつなげるという意味が合計であれば、以下のようにします。

awk '{print $X + $Y}' file1 > file2
awk -v X=4 -v Y=6 '/^#/{next}{sum=0; for (i=X; i<=Y; i++) sum+=$i; print
sum}' file1 > file2
  • 以下のようにします。 - Ed Morton (2006年02月01日 00時33分35秒)
BEGIN{ ARGV[ARGC++] = ARGV[1] }
NR==FNR { start = FNR - 500; next }
/^#/ { next }
FNR >= start {sum=0; for (i=X; i<=Y; i++) sum+=$i; print sum}

という whatever.awk を用意して、

awk -v X=4 -v Y=6 -f whatever.awk file1 > file2

とします。

  • 言葉が足りませんでした。 - nda_ridge (2006年02月01日 00時36分00秒)
# Commented line
# Commented line
1000 2000 3000
1001 2001 3001
1002 2002 3002
1003 2003 3003

というファイルがあって、2, 3 コラムを抜き出して、以下のようにします。

2000
2001
2002
2003
3000
3001
3002
3003

また、次に欲しいのがこの 2, 3 コラムの最後の 2 行づつが欲しいのです。

2002
2003
3002
3003

少し改良した以下のものが欲しいものでした。

BEGIN{ ARGV[ARGC++] = ARGV[1] }
NR==FNR { start = FNR - 2; next }
/^#/ { next }
FNR >= start {for (i=X; i<=Y; i++)print $i; }

最後の 2 行を抜き出すにはどうすればいいのでしょうか?

  • X, Y と同じようにすればいいのです。 - Ed Morton (2006年02月01日 00時38分20秒)

{{comment}}

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


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