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

お名前
件名
本文

books about awk - Marco Arthur (2006年02月26日 02時35分13秒)

Debian を動作させていますが、awk と gawk の差が書かれた良い本はありますか?

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


  • WikiPedia? に良い本が書かれています。 - Juergen Kahrs (2006年02月26日 02時35分55秒)

差がカラーで示された awkcard が良いと思います。これは以下のようにして入手できます。

 wget http://ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.gz
 cd gawk-3.1.5
 ./configure
 make
 cd doc
 make postscript
 gv awkcard.ps
  • 私の参考書はマニュアルです。 - Grant (2006年02月26日 02時37分46秒)

また、

info gawk

でも有益な情報が得られます。

  • 以下のものです。 - Joel Reicher (2006年02月26日 02時39分18秒)

今はオンラインで入手できます。

{{comment}}

how implement timeout for getline? - Grant (2006年02月26日 02時29分46秒)

サーバー / クライアントのアプリケーションを作っていますが、サーバーからの反応がない場合に、ハングするのではなく、終了させるようなことはできますか?

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


  • xgawk でできます。 - Andrew Schorr (2006年02月26日 02時30分10秒)

xgawk には sleep 関数を搭載しています。

  • この xgawk の time.c には変更が加えられていませんが…。 - Grant (2006年02月26日 02時32分08秒)
  • ここのものには加えられていませんが、cvs のものには加えられています。 - Juergen Kahrs (2006年02月26日 02時32分42秒)

{{comment}}

shell script to get second field with specific range - bshah (2006年02月26日 02時25分03秒)

以下のようなファイルがあります。

2738 sshah
2732 denton
2731 stark
161 carnason
160 strupeni
160 sthind
160 stephh
158 sonjac
158 rmorcom
158 jcurtis
158 gargs
156 tricias
155 sshakiro
155 mattdonn
101 test
112 test2

1 番目のフィールドで 100 から 150 のものを 2 番目のフィールドだけにすることができますか?

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


  • 以下のようにしてできます。 - Joel Reicher (2006年02月26日 02時25分23秒)
awk '100<=$1 && $1<=150 { print $2 }'
  • 100 から 150 のトータルを表示することはできますか? - bshah (2006年02月26日 02時26分35秒)
  • できます。 - martin cohen (2006年02月26日 02時26分55秒)
awk '100<=$1 && $1<=150 { print $2; s += $1 }END{print s}'

{{comment}}

Finding lines with a common beginning - mickey (2006年02月26日 02時11分36秒)

  some name :
   Char 2: 0 -> 3
   Char 3: 2 -> 4
   Char 5: 0 -> 2
  some other name :
   Char 3: 4 -> 3
   Char 5: 2 -> 4
  another name :
   Char 3: 2 -> 4

のようなフォーマットのファイルがあります。

Char x: a -> b

という部分ではじまっている部分がありますが、これを awk で以下のようにします。

   Char 3: 2 -> 4
   Char 3: 4 -> 3
   Char 5: 0 -> 2
   Char 5: 2 -> 4

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/046e8fa1d03193ad/d69a05b06ac379d3?hl=ja#d69a05b06ac379d3


  • 以下のものでできます。 - Harlan Grove (2006年02月26日 02時13分00秒)
#-- begin script.awk --
#set field separator for convenience, read names into array an,
#and set input filename
BEGIN {
  FS = ":"
  for (i = 1; i < ARGC; ++i) an[ARGV[i]] = 0
  ARGC = 2
  ARGV[1] = "your input filename here"
}

#strip any leading or trailing whitespace from $1
{
  k = $1
  gsub(/(^[ \t]+)|([ \t]+$)/, "", k)
}

#check for names in input file matching those in array an
#and record matches; note: records beginning with graphic
#characters are assumed to be names
$1 !~ /^[ \t]/ {
  if (s = (k in an)) an[k] = ++n
}

#convenience: skip nonname records when state s is false
#and the record doesn't begin with w/s Char w/s
!(s && /^[ \t]+Char[ \t]/) {
  next
}

#first matched name: record all Char lines
n == 1 {
  aco[++cc] = k
  ac[k] = cc
  av[cc, 0] = 1
  av[cc, 1] = $0
}

#subsequent matched names with Char line matching one from
#the first matched name
n > 1 && k in ac {
  av[ac[k], ++av[ac[k], 0]] = $0
}

#input completed, now output
#skip all recorded Char lines with fewer instances than the
#number of names given on the cmdline; note: no output if any
#name given on the cmdline wasn't found in the input file
END {
  for (i in an) if (an[i] == 0) exit

  for (i = 1; i <= cc; ++i)
    if (av[ac[aco[i]], 0] == n)
      for (k = 1; k <= n; ++k)
        print av[i, k]
}
#-- end script.awk --

これを以下のようにして実行します。

awk -f script.awk "some name" "some other name" "another name"
  • 以下のものが参考になると思います。 - Ted Davis (2006年02月26日 02時14分42秒)
  BEGIN{
    for( x = 1; x < ARGC; x++ ) {
        A[ ARGV[ x ] ]
        delete ARGV[ x ]
    }
    ARGC = 1
    Flag = 0
  }
  {
    if( $1 !~ /^Char$/ ) Flag = 0
    if( Flag ) print $0
    if( $1 in A ) Flag = 1
  }
e:\myfiles>awk -f awktest.awk some_name some_other_name < test.txt
       Char 1: 0 -> 3
       Char 2: 2 -> 4
       Char 3: 0 -> 2
       Char 4: 4 -> 3
       Char 5: 2 -> 4
  • 以下のようにしてできます。 - hi_saitoWilliam James (2006年02月26日 02時16分26秒)
BEGIN { FS = " *: *"  ;  ORS = ""
  while ( ARGC > 2 )
    names[ ARGV[ --ARGC ] ]
}

# Remove leading and trailing whitespace.
{ gsub( /^[ \t]+|[ \t]+$/, "" ) }

# If it's a name, remember it.
/:$/ { name = $1; next }

# If this is data for one of the names that we're examining...
name in names { data[name,$1] = $2 ; chars[$1] }

END {
  for ( char in chars )
  { common = 1 ; out = ""
    for ( name in names )
      if ( (name,char) in data )
        out = out char ": " data[name,char] "\n"
      else
        common = 0
    if ( common )
      print out
  }
}
awk -f common.awk mydata "some name" "some other name"

Char 3: 4 -> 3
Char 3: 2 -> 4
Char 5: 2 -> 4
Char 5: 0 -> 2

{{comment}}

function help required - Dr Strangelove (2006年02月21日 00時07分59秒)

1 時間 12 分 10 秒が以下のようになっています。

01:12:10

そこで、以下のようなコードを書きました。

time = $5
split(time,time_array,":")

そして、以下のコードの中に function として埋め込んで何度も使いたいのです。

if ( time_array[1] > 0 ) {
                        hour = time_array[1] * 3600
                        if ( time_array[2] > 0 ) {
                                 minutes = time_array[2] * 60
                        }
                        total_time = hour + minutes + time_array[3]
                }
                if ( time_array[1] == 0 && time_array[2] > 0 ) {
                        minutes = time_array[2] * 60
                        total_time = minutes + time_array[3]
                }
                if ( time_array[1] == 0 && time_array[2] == 0 ) {
                        total_time = time_array[3]
                }

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


  • 以下のようにすればできます。 - Joel Reicher (2006年02月21日 00時09分03秒)
function tosecs(time, t) {
       split(time, t, ":")
       return 60*(60*(24*t[1]+t[2])+t[3])
}
  • もっと簡単にできます。 - pop (2006年02月21日 00時10分10秒)
total_time = time_array[1]*3600 + time_array[2]*60 + time_array[3]
  • 以下のような関数を定義します。 - William James (2006年02月22日 01時26分13秒)
function to_secs( time,      tmp )
{ split( time, tmp, ":" )
  return tmp[3] + tmp[2] * 60 + tmp[1] * 3600
}

{{comment}}

Awk? Undent source code file... - delraydog (2006年02月20日 23時52分59秒)

簡単な実行可能なもので、先頭のスペースとタブを除くものはありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/81d628e511112fc4/26e9465e378a172c?hl=ja#26e9465e378a172c


  • 以下のようにしてできます。 - William James (2006年02月20日 23時53分20秒)
awk '{sub(/^[ \t]+/,"");print}' oldfile >newfile
  • /[ \t]*/ ではないですか? - Joel Reicher (2006年02月20日 23時54分14秒)
  • 以下の 9 文字で OK です。 - Kenny McCormack? (2006年02月20日 23時54分49秒)
sub(/[ \t]*/,"")
  • + ではなく * です。 - William James (2006年02月20日 23時55分37秒)
BEGIN {
  $0 = "abaaaaa"
  sub(/a*/, "")
  print
}

これの結果が、"ab" ではなく、"baaaaa" であることからも分かります。

BEGIN {
  $0 = "the <b>only</b> way"
  sub(/<.*>/, "")
  print
}

の結果は "the way" です。

  • でも、その正規表現が分かりやすいと思いますか? - Joel Reicher (2006年02月20日 23時58分44秒)

私なら、

{ print substr($0, match($0, /[^ \t]/)) }

とします。

  • 私なら以下のようにします。 - Ed Morton (2006年02月20日 23時59分49秒)
sub(/[ \t]*/,"")
  • 変わった方法では以下のようにできます。 - Joel Reicher (2006年02月21日 00時00分45秒)
while(i++<length())
       if(" "!=substr($0, i, 1) && "\t"!=substr($0, i, 1))
               break
print substr($0, i)
  • 以下のようにしてできます。 - Chris F.A. Johns (2006年02月21日 00時02分18秒)
awk '{$1 = $1; print}'
  • Chris F.A. Johns の方法だとスペース以外にも該当してしまいますよ。 - William James (2006年02月21日 00時03分42秒)

{{comment}}

awk/sed trouble - help needed urgently - mkrol (2006年02月19日 21時02分32秒)

procmail で生成された数百ものファイルがあり、以下のようなものです。

file: jsmith
contents of file:  228;131;140;180;192;178;165;247;115;40;216;243

jdoe
217;158;50;177;150;88;183;208;232;193
.
.
last_user
266;327;0;83;177;193;126;183;55;228;131;140

これを 1 つの大きなファイルにできますか?

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


  • 以下のようにします。 - Chris F.A. Johns (2006年02月19日 21時02分56秒)
awk '{print}' * > newfile
  • 以下のようにしてできます。 - Ted Davis (2006年02月19日 21時06分21秒)
awk "{print $0}" *.* > big_file

{{comment}}

TIOBE Programming Community Index - Juergen Kahrs (2006年02月19日 20時57分57秒)

TIOBE Programming Community のインデックスがあるのはご存知の方が多いと思います。

ここではサーチエンジンの結果を集計していますが、POSIX の awk としてカウントされているようです。

これに対して、TIOBE の Paul Jansen に集計方法の見直しを依頼したので、来月は awk が TOP 20 に入ることでしょう。

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


{{comment}}

two scripts, no output - Rufus T. Firefly (2006年02月18日 22時01分13秒)

$ cat <<EOF >fun
#!/usr/bin/awk -f
function fun(x) { return x }
BEGIN   { parameter=1 }
EOF
$ chmod +x fun

とやって、

$ seq 10 |awk -f fun '{print fun($1)}'
$ seq 10 |fun '{print fun($1)}'

のようにしてもアプトプットが得られません。

$ seq 10 |fun --source '{print fun($1)}'

とすれば、出力されるのですが、"--source" なしでやる方法がありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/25e8f51975011821/5a7d0c1149ece85a?hl=ja#5a7d0c1149ece85a


  • seq が何か分からないし、自分のところでは、"fun: Command not found" となります。shell グループに話をした方が良いのではないでしょうか? - Kenny McCormack? (2006年02月18日 22時03分26秒)
  • "- -source" は gawk の特有の機能です。 - Joel Reicher (2006年02月19日 20時51分24秒)
  • こういうのもできます。 - William James (2006年02月19日 20時52分18秒)
C:\awk>type f.awk
function sq(x)
{ return x*x
}

C:\awk>echo BEGIN{print sq(3)} |awk -f "-" -f f.awk
9
  • 上記のようにできますか? - Rufus T. Firefly (2006年02月19日 21時05分07秒)
$ gawk 'BEGIN{print sq(3)}' 'function sq(x) {return x*x}'
9

のようなもので十分です。

  • 「一般的な」awk では 2 つの "-f" を使うことはできません。 - Joel Reicher (2006年02月20日 23時50分37秒)

{{comment}}

retrieve script name - Rufus T. Firefly (2006年02月18日 21時57分35秒)

#!/usr/bin/awk -f
# script.awk -- just loading functions
function A(x)   { return x }
function B(x)   { return x*x }
function C(x)   { return sqrt(x) }
# EOF

のようなスクリプト (script.awk) があり、それぞれのファイルはリンクされています。

$ ln script.awk A
$ ln script.awk B
$ ln script.awk C

このような時にスクリプト名を得ることはできますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/6592e66d183be857/200cd658c635de8c?hl=ja#200cd658c635de8c


  • awk では無理ですが、以下のようにすることで他で処理できるでしょう。 - Joel Reicher (2006年02月18日 21時58分13秒)
#!/bin/sh
awk -f script.awk "scriptname=${0##*/}"

{{comment}}

yamp yet another multiline post - Mike Dundas (2006年02月18日 21時53分09秒)

以下のようなログファイルがあります。

*******************

start app timestamp
return string from application
app complete timestamp

*******************

start app timestamp
return string from application
app complete timestamp

データを扱った場合にはさらに 10 行出力され、そこにユニークなコードがはいります。

データを処理できなかった時のものだけ抜き出したいです。

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


  • 詳細を教えてくれれば、もっと手助けできるでしょう。 - William James (2006年02月18日 21時53分37秒)
{ text = text $0 "\n" ; count++ }
!NF && count > 2 {
  if ( text !~ /unique word/ )
    printf "%s", text
  text = count = ""
}

{{comment}}

Why does ARGC =1 ???? - richdyer_2000 (2006年02月18日 21時46分01秒)

処理しているファイル名を得たいので、以下のようにしましたが、得られません。

nawk -f anx_sv_rules.nawk < FDFx_ORBITPREDICT

のようにしても、

print ARGC returns "1"
print ARGV[0] returns "nawk"
print ARGV[anything greater than 1] returns ""
print FILENAME returns "-"

のようになってしまいます。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/054d704667411184/1be0e302b9e660b9?hl=ja#1be0e302b9e660b9


  • まず、ファイル名は以下のようにしないと得られません。 - William James (2006年02月18日 21時47分02秒)
nawk -f anx_sv_rules.nawk FDFx_ORBITPREDICT

{{comment}}

Cleaning up the PATH - James (2006年02月18日 21時42分24秒)

PATH=aa:bb/cc:aa:xx/yy:bb/cc.

という環境変数を仮定します。

awk で

PATH=aa:bb/cc:xx/yy

とすることはできますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/29f256fb1e76624d/a171d88840877fd6?hl=ja#a171d88840877fd6


  • 以下のようにします。 - William James (2006年02月18日 21時42分48秒)
awk 'BEGIN{FS=":"}{for(i=1;i<=NF;i++)if(!a[$i]++)printf
"%s%s",(i>1?":":""), $i}'

{{comment}}

Need to print 2 chars (or ints) from a string, sugestions? - ponga (2006年02月18日 21時37分51秒)

shell スクリプトのアウトプットは以下のようなものです。

D54C

この 2 番目と 3 番目の "54" を整数として取り出すにはどうすればいいですか?


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

  • 例えば以下のようにします。 - Janis Papanagnou (2006年02月18日 21時38分13秒)
awk 'match ($0,/[0-9]+/) { print substr($0,RSTART,RLENGTH) }'

こうすると最初の整数部分を取得できます。

{ print substr ($0,2,2) }

この場合には 2 番目から 2 文字を抽出します。

  • 以下のようにします。 - William James (2006年02月18日 21時39分31秒)
awk '{print substr($0,match($0,/[0-9]/))+0}'

もしくは

awk '{gsub(/[^0-9]/,"")}8'

のようにもできます。

  • 他のやり方として、以下のようなものもあります。 - Harlan Grove (2006年02月18日 21時40分49秒)
awk '$2 { print $2 }' FS='[^0-9]+'

{{comment}}

= = ignores spaces? - jcombe (2006年02月18日 21時34分06秒)

yes | awk '{print "1 | 1|"}' | awk -F "|" '{if ( $1 == $2 ) {print
$0}}'

$1, $2 にはスペースが含まれているはずなのに無視されます。

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


  • これは数値として認識されているからです。避けるには以下のようにします。 - John DuBois? (2006年02月18日 21時35分05秒)
if ( "" $1 == $2 ) ...

{{comment}}

how to deal with spaces and tabs - M.H (2006年02月17日 00時32分42秒)

以下のような /etc/hosts があり、区切りは複数のスペースまたは複数のタブです。

10.244.200.1    sapas2  SAPAS2
10.244.201.17   prevcs  PREVCS
10.244.200.6    sapas3  SAPAS3
10.244.200.9    sapas4  SAPAS4
10.244.201.11   sapas1  SAPAS1 sapmsgsrv
10.244.201.12   prodvcs PRODVCS
10.244.201.33   sapps0  SAPPS0
10.244.201.15   oraaq1  ORAAQ1
#10.244.201.18   sapaq1  SAPAQ1
#10.244.201.26   saptc1  SAPTC1
#10.244.201.29   sapdv1  SAPDV1
10.246.17.114   sapaq1  SAPAQ1
10.246.9.112   saptc1  SAPTC1
10.246.17.110   sapdv1  SAPDV1

このような場合にどうやれば 10.244.200.1 を変更できますか?

sed 's/10\.244\.200\.1 /192\.168\.10\.1 /'

では、スペース以外の区切りには対応していません。

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


  • sed はオフトピックなので、awk では以下のようにします。 - Kenny McCormack? (2006年02月17日 00時33分37秒)
BEGIN { OFS="\t" }
sub(/10\.244\.200\.1/,"192.168.10.1",$1)+1

{{comment}}

Calculating number of matching in the line - Beta (2006年02月17日 00時22分52秒)

          0        2.5504       1.73895       1.75297       2.38142
         10        2.6193       1.13652       1.63769       2.22861
         20       2.95657       1.16707       1.82736       2.44608
         30        2.7374        0.8282       2.26192       2.11628
         40       2.38069       1.25262       2.05285       2.15112
         50       2.73631       1.44986        1.9855        2.1161
         60        2.7037       1.31613       1.70611       2.23901
         70       2.87295       1.48457       1.92777       2.13292
         80       2.93323       1.24506       1.83585       2.06434
         90       2.90665       1.77117        1.7525       1.88961
        100       2.77799       1.67147       1.64062       1.95929

のようなファイルがあります。

ここから 2 よりも小さいものの数を抜き出します。

          0        2
         10        2
         20        2
         30        1
         40        1
         50        2
         60        2
         70        2
         80        2
         90        3
        100        3

また、1.5 以上 2 以下の数を抜き出します。

          0       2
         10       1
         20       1
         30       0
         40       0
         50       1
         60       1
         70       1
         80       1
         90       3
        100       3

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/89e3c967b5bbfe7f/7b82c4015fde887f?hl=ja#7b82c4015fde887f


  • 以下のようにします。 - Michael Heiming (2006年02月17日 00時23分31秒)
awk '{c=0;for (i=2;i<=NF;i++) if ($i<2) c++}{print $1,c}' infile

また、1.5〜2 のものは上のものを加工すれば、作れるでしょう。頑張ってください。

  • 他の方法のハックをしてみます。 - Janis Papanagnou (2006年02月17日 00時25分46秒)
awk '{print $1,($2<2)+($3<2)+($4<2)+($5<2)}' infile

50 % 早くできますよ。キータイプも少ないし。

  • 別の方法です。 - William James (2006年02月17日 00時27分09秒)
{ for (i=2; i<=NF; i++)
    if ( $i >= 2 )  $i = ""
  $0 = $0
  print $1, NF - 1
}
  • 一般的な方法を書いておきます。 - Ed Morton (2006年02月17日 00時28分36秒)
awk -v gt=0 -v lt=2 '{c=0; for (i=2;i<=NF;i++) if ($i > gt && $i < lt)
c++; print $1,c}' file
awk -v gt=1.5 -v lt=2 '{c=0; for (i=2;i<=NF;i++) if ($i > gt && $i < lt)
c++; print $1,c}' file

{{comment}}

how to escape ' - Tom76 (2006年02月15日 22時52分53秒)

UNIX の shell で、

$cat t.txt |awk '{a=a",\'"$1"\'"} END{print a}'
                                ^

どうやれば、print $1 ができますか?

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


  • シングルクォートを使います。 - Chris F.A. Johnson (2006年02月15日 22時53分31秒)
awk -v sq="'" '{ print sq $1 sq}'
  • 以下のようにしてエスケープします。 - Joel Reicher (2006年02月22日 01時24分46秒)
awk 'BEGIN { print "'\''" }'

awk プログラムの中では以下のようにします。

BEGIN { print "'" }

{{comment}}

sed question: when pattern1 found, replace the pattern2 in the next record - M.H (2006年02月14日 23時31分56秒)

         IPMultiNICB cluster_ip (
                 BaseResName = mnicb_prod
                 Address = "10.244.201.12"
                 NetMask = "255.255.255.0"
         IPMultiNICB sapps0_ip (
                 BaseResName = mnicb_prod
                 Address = "10.244.201.33"
                 NetMask = "255.255.255.0"
                 )
...
..
.

         IPMultiNICB sav_sapps0_ip (
                 BaseResName = mnicb_nbu
                 Address = "10.1.1.20"
                 NetMask = "255.255.255.0"
                 )
...
..
.

というファイルがあります。

Address = "10.244

という部分を見つけたら、

NetMask = "255.255.255.192"

というレコードに変更したいのですが、どうすればいいでしょうか?

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


  • 以下のようなことを望んでいるのだと思います。 - Ed Morton (2006年02月14日 23時51分13秒)
awk
'/Address/{f=($3~/\"10.244/?1:0)}f&&/NetMask/{sub($3,"\"255.255.255.192\"")}1'
file

{{comment}}

Newbie question on awk - sylvain (2006年02月12日 22時18分10秒)

テーブル名やフィールドが更新された時にデータベースのフィールドも更新しようと思っています。

tb1    field4


tb2    field3
tb2    field4

のような table.txt があり、

for TABLE in `awk  '{print $1}' tables.txt`
  do
      for FIELD in `awk -v tbl="$TABLE" '$1=tbl {print $2}' tables.txt`



          do
          echo "Field $FIELD from $TABLE is updated"
      done
done

のようなスクリプトで動作させようとしていますが、何も表示されませんでした。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/9991965857c0a531/42eff37a20b76b48?hl=ja#42eff37a20b76b48


  • 自己解決しました。 - sylvain (2006年02月12日 22時19分01秒)
for ACCKEY in `awk  '{print $1}' T098.txt`
  do
       for FIELD in `awk -v key=$ACCKEY '$1 ~ key { print $2 }'
T098.txt`
          do
          echo "Field $FIELD from T098 $ACCKEY is being updated on
$SCHEME_TGT"
            done
     done
  • 問題点は、比較の際に "==" ではなく "=" を使ってしまっているからです。 - Juergen Kahrs (2006年02月12日 22時20分12秒)

{{comment}}

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


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