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

お名前
件名
本文

variable range of input - felix (2006年03月26日 23時32分55秒)

$2 ~ /12.97|12.98|12.99|13.00|13.01/ { print $2, $8, $9}

という部分がありますが、これをある範囲 (12.97 以上 13.01 以下) に対して適用するようにできますか?

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


  • 以下のようなものでいいのでしょうか? - Janis Papanagnou (2006年03月26日 23時33分57秒)
$2 >= 12.97 && $2 <= 13.01 { print $2, $8, $9}

Re: - felix (2006年03月29日 23時11分03秒)

以下のようなエラーになります。

2 12.978 8 BB AA x y 123 5.8

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

UNIX 上では正常に動作しています。

$ echo "2 12.978 8 BB AA x y 123 5.8" |
    awk '$2 >= 12.97 && $2 <= 13.01 { print $2, $8, $9 }'
12.978 123 5.8

とりあえず、LANG=C で動作させてみてはどうでしょうか?

Re: - felix (2006年03月29日 23時14分17秒)

何も出力されませんでした。

$2 ~ /12.97/

とすれば、

12.978

と出力されます。

{{comment multi|w}}

AWK Code to Strip C comments - pardha.saradhik (2006年03月26日 23時23分24秒)

C のコメントを完全に除去する awk スクリプトはありますか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/dfe9091af22f0c66/01d0fc7f76c44d62?hl=ja#01d0fc7f76c44d62


  • 以下のようにします。 - Janis Papanagnou (2006年03月26日 23時23分55秒)
/\/\*/,/\*\// { next } 1
  • 以下のような場合はどうしますか? - Galen (2006年03月26日 23時24分55秒)
printf("/*This isn't a comment.\n/*");
  • C のパーサーなしではできないでしょう。 - Ed Morton (2006年03月26日 23時26分37秒)
  • 以下のようなものを考えました。 - William James (2006年03月26日 23時27分38秒)
BEGIN { ORS = "" }

{ code = code $0 "\n" }

END {
  while ( length(code) )
    code = process( code )
}

function process( text        )
{
  if ( match( text, /"|'|\/\*|\/\// ) )
    return span( text )
  print text
  return ""
}

function span( text           , starter )
{
  print substr( text, 1, RSTART - 1 )
  starter = substr( text, RSTART, RLENGTH )
  text = substr( text, RSTART + RLENGTH )

  if ( "\"" == starter || "'" == starter )
    return quoted( text, starter )
  if ( "//" == starter )
    return remove( text, "\n", "\n" )
  return remove( text, "*/", " " )
}

function remove( text, ender, replacement )
{
  print replacement
  return substr( text, index(text, ender) + length( ender ) )
}

function quoted( text, starter )
{
  if ( "'" == starter )
    match( text, /^(\\.|[^'])*'/ )
  else
    match( text, /^(\\.|[^"])*"/ )
  print starter substr( text, 1, RLENGTH )
  return substr( text, RSTART + RLENGTH )
}
  • 以下のものは有効な C のコメントとしますか? - William James (2006年03月26日 23時29分04秒)
/*
  /* Print "hello". */
  puts( "hello" );

  /* Print "*/". */
  puts( "*/" );
*/

Re: - E. Rosten (2006年03月29日 23時04分50秒)

以下のようなスクリプトでできます。

{
	#state
	#0=normal, 1=in string , 2=in C comm, 3= in C++ comm	

	for(i=1; i <= length($0); i++)
	{
		c = substr($0, i, 1)

		if(state == 0)
		{
			if(c == "/")
			{
				d = substr($0, i+1, 1)
				if(d == "*")
					state = 2	
				else if(d == "/")
					state=3
				else
					printf("%s", c d)
				
				i=i+2
				continue
			}
			else if(c == "\"")
				state = 1
		}
		else if(state == 1)
		{
			if(c == "\"" && substr($0, i, 1) != "\\")
				state = 0
		}
		else if(state == 2 && i > 1 && substr($0, i-1,2) == "*/")
		{	
			state = 0
			c = " "
		}
		
		if(state < 2)
			printf("%s", c)

	}
	
	if(state == 3 && !/\\$/)
		state = 0
	
	if(state < 2)
		print ""
}

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

以下のようなものには対応できていません。

$ cat tst.c
#include "stdio.h"

#define GOOGLE(txt) printf("Google web page = " #txt "\n")

int main(void) {
  GOOGLE(http://www.google.com);
}

これは、

$ awk -f tst.awk tst.c
#include "stdio.h"

#define GOOGLE(txt) printf("Google web page = " #txt "\n")

int main(void) {
   GOOGLE(http:
}

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

Re: - E. Rosten (2006年03月29日 23時07分45秒)

以下の部分を修正すれば動作します。

if(c == "\"" && substr($0, i, 1) != "\\")

if(c == "\"" && substr($0, i-1, 1) != "\\")

にします。

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

まだまだ不十分です。

$ cat tst.c
#include "stdio.h"

int main(void) {
   /* the next line uses a trigraph instead of a backslash character */
   printf("comments start with ??/"/*\"\n");
}
$ ./strip.gcc -trigraphs tst.c
#include "stdio.h"

int main(void) {

   printf("comments start with \"/*\"\n");
}
$ awk -f tst.awk tst.c
#include "stdio.h"

int main(void) {

   printf("comments start with ??/"$

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

{{comment multi|w}}

Fixed Width pattern matching - kels (2006年03月26日 23時20分37秒)

153 か 206 文字目から 8 文字が 0008508 or 95265540 or 93845432 に該当するかどうかを調べます。

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


  • 以下のようにします。 - Harlan Grove (2006年03月26日 23時21分01秒)
BEGIN { a["0008508"] = a["95265540"] = a["93845432"] }
substr($0, 153, 8) in a || substr($0, 206, 8) in a { <your code here> }

のようにするか、

" 0008508 95265540 93845432 " ~ " (" substr($0, 153, 8) "|" substr($0,
206, 8) ") " { . . . }

のようにします。

{{comment}}

duplicate field deletion - Mike Dundas (2006年03月26日 23時09分16秒)

01,aaaa:2006,aaaa:2007,bbbb:2006,bbbb:2007
02,aaaa:2006,aaaa:2007,bbbb:2006,cccc:2006
03,aaaa:2006,aaaa:2007,bbbb:2006,dddd:2007

のようなファイルがありますが、フィールドがダブっています。

これを以下のように出力します。

01,aaaa:2006,xxxx:2006,aaaa:2007,xxxx:2007,bbbb:2006,bbbb:2007
02,aaaa:2006,xxxx:2006,aaaa:2007,xxxx:2007,bbbb:2006,cccc:2006
03,aaaa:2006,xxxx:2006,aaaa:2007,xxxx:2007,bbbb:2006,dddd:2007,xxxx:2007

除く方法はありますか?

以前、ここで回答をもらったものです。

BEGIN { ORS=RS="," ; OFS=FS=":" }
{ print $1,$2 ; if ($1 == "aaaa" || $1 == "dddd") print "xxxx",$2 }

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


  • 配列に読み込んで最後に END の中で表示します。 - Grant (2006年03月26日 23時15分07秒)
  • 以下のようにします。 - Janis Papanagnou (2006年03月26日 23時15分52秒)
  {
      n=split($0,a,",")
      printf("%s",a[1])
      for (i=2; i<=n; i++)
      {
          split(a[i],b,":")
          printf(",%s",a[i])
          if (b[1]=="aaaa"||b[1]=="dddd")
              if (!(b[2] in suppress))
                  printf(",xxxx:%s",b[2])
          suppress[b[2]]
      }
      printf("\n")
      delete suppress
  }

{{comment}}

How to use OFS - James (2006年03月26日 23時05分58秒)

aa bb cc .......

aa|bb|cc|.......

にしたいのですが、以下のようになりました。

echo aa bb cc | awk 'BEGIN{OFS="|"}{print}'
aa bb cc

または

echo aa bb cc | awk 'BEGIN{OFS="|"}{print $1,$2,$3}'
aa|bb|cc

後者のように $1, $2, $3 を続けるのではなく、OFS を変更する方法はありますか?

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


  • 以下のようにします。 - Michael Heiming (2006年03月26日 23時06分31秒)
echo aa bb cc | awk 'BEGIN{OFS="|"}{$1=$1;print}'

{{comment}}

Combining Multiple Files data into one - hi_saito (2006年03月22日 02時04分56秒)

peter|val1|val2|0000
peter|val3|val4|0000
john|val1|val2|0000
john|val3|val4|0000
peter|val1|val3|7676
peter|val4|val6|7645
dick|val1|val2|454

というファイルと

peter|otherval1|otherval2|66655
John|someval|someval3433
peter|someval|someval|4343
dick|someval|someval

というファイルから以下のようなファイルは作れますか?

peter|val1|val2|0000|otherval1|otherval2|66655
peter|val3|val4|0000|otherval1|otherval2|66655
john|val1|val2|0000|someval|someval3433
john|val3|val4|0000|someval|someval3433
peter|val1|val3|7676|someval|someval|4343
peter|val4|val6|7645|someval|someval|4343
dick|val1|val2|454|dick|someval|someval

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


  • 以下のようにします。 - DR (2006年03月22日 02時05分18秒)
join -i -t "|" File1.txt File2.txt

{{comment}}

count distinct values - patrick (2006年03月22日 01時59分52秒)

1, 100, 2, ...
3, 100, 2, ...
5, 200, 2, ...
8, 100, 2, ...

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

$2 の正確な数値を使って配列を形成しようとしています。

100 : 3
200 : 1

のようにカウントすることはできますか?

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


  • 以下の URL のものを使えばできます。 - DR (2006年03月22日 02時00分57秒)

{{comment}}

remove consecutive blank lines - Jeff Higgins (2006年03月22日 01時50分47秒)

BEGIN {done_blank = 0}
{if (NF == 0)
   {if (done_blank == 0)
     {print $0; done_blank = 1;}
   }
 else
   {print $0; done_blank = 0;}
}

というスクリプトがあります。

入力ファイルは以下のようなものです。

This is line 1.
<space><tab><space>
<blank>
<blank>
This is line 2.
<blank>
<space><tab><space>
<blank>
This is line 3.
<blank>
<blank>
This is line 4.

出力は

This is line 1.
<space><tab><space>
This is line 2.
<blank>
This is line 3.
<blank>
This is line 4.

のようになりますが、欲しい出力は以下のとおりです。

This is line 1.
<blank>
This is line 2.
<blank>
This is line 3.
<blank>
This is line 4.

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/cbc9252a3896d234/539ce747184391a3?hl=ja#539ce747184391a3


  • 以下のようにしてできます。 - Ed Morton (2006年03月22日 01時51分29秒)
awk -v RS= '{ORS=(RT?"\n\n":"\n")}$1=$1'

最後に空行ができても良いのであれば、以下のようにしてもできます。

awk -v RS= '$1=$1{printf "%s\n\n",$0}'

テキストの間のスペースを省略しなくても良いのであれば、以下のようにしてもできます。

awk -v RS= '{ORS=(RT?"\n\n":"\n");gsub(/[[:space:]]*$/,"")}NF'
  • 以下のようにしてできます。 - Harlan Grove (2006年03月22日 01時53分48秒)
awk 's && /^[ \t]*$/ { print "" }; s = /[^ \t]/'
  • Harlan Grove のものは Solaris では動作しません。 - Gordon Elliot (2006年03月22日 01時54分43秒)
  • 以下のようにしてみました。 - Jeff Higgins (2006年03月22日 01時55分35秒)
BEGIN {done_blank = 0}
 {if (NF == 0)
{if (done_blank == 0)
      {$0 = ""; print $0; done_blank = 1;}
    }
 else
   {print $0; done_blank = 0;}
 }
  • 以下のようにすることもできます。 - Gordon Elliot (2006年03月22日 01時56分32秒)
NF { print;done_blank=0;next }
!done_blank { $0 = ""; print; done_blank = 1 }

{{comment}}

Awk pattern matching is failing if input file has 'unix' keyword. - awker (2006年03月20日 00時15分44秒)

[username@localhost Awk_Ideas]$ cat inputfile
Apple 1 2 3 4
unix 5 6 7 8
Me 1 2 34 4 5
You 1 2 3 4 5 6
tms08 3 4 5 6
END of input

というファイルがあり、

[username@localhost Awk_Ideas]$ awk '$1 ~ /^[A-Z]*$/{print $1}' inputfile
Apple
Me
You
END

となり、unix にマッチしません。

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


  • それは正規表現が異なっているからで、[A-Za-z] とします。 - Janis Papanagnou (2006年03月20日 00時16分18秒)
  • 本当に欲しいのは、最初のフィールドに大文字が含まれているものを抽出するものです。 - awker (2006年03月20日 00時17分22秒)
  • それは最初の質問と異なりますが、以下のようにします。 - Janis Papanagnou (2006年03月20日 00時17分53秒)
awk '$1 ~ /[A-Z]/ {print $1}'
  • うまくいきません。 - awker (2006年03月20日 00時22分34秒)
[username@localhost Awk_Ideas]$ cat inputfile
Apple 1 2 3 4
unix 5 6 7 8
Me 1 2 34 4 5
You 1 2 3 4 5 6
tms08 3 4 5 6
xyz 1 2 3 4
END of input
[username@localhost Awk_Ideas]$ awk '$1 ~ /[A-Z]/ {print $1}' inputfile
Apple
unix
Me
You
tms08
xyz
END
  • LANG=C で試してみてください。 - Patrick TJ McPhe? (2006年03月20日 00時23分43秒)
  • やはりうまくいきません。 - awker (2006年03月20日 00時25分17秒)
[username@localhost Awk_Ideas]$ LANG="C"
[username@localhost Awk_Ideas]$ awk -f scriptfile inputfile
END
[username@localhost Awk_Ideas]$ cat scriptfile
$1 ~ /^[A-Z]+$/ {print $1}
  • 何がやりたいのか不明ですが、以下のものを動かしてみてください。 - Chris F.A. Johns (2006年03月20日 00時27分05秒)
LC_ALL=C awk '$1 ~ /[A-Z]/ {print $1}' inputfile
  • 以下のようにします。 - billposer (2006年03月26日 23時00分23秒)
[[:upper:]]

{{comment}}


木村さんが指摘されていた件と同じ問題ですね。awk が壊れているだの、いろいろ議論されていますが、ここに書かれている内容と同じです。

Stop default print - Mr_Bill (2006年03月20日 00時05分58秒)

gawk '{print $0}'

というのは全てを出力するのは分かっています。

uniq -c | gawk '(tot+=$1); END {print "03/16/06: " tot}'

というのをやっていて、{print "03/16/06: " tot} の部分だけ欲しいのです。

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


  • 以下のように () を {} にすればいいのです。 - pop (2006年03月20日 00時06分17秒)
uniq -c | gawk '{tot+=$1}; END {print "03/16/06: " tot}'
  • セミコロンは必要ないです。 - Ed Morton (2006年03月20日 00時07分08秒)
uniq -c | gawk '{tot+=$1} END {print "03/16/06: " tot}'

また、行数のカウントなら

awk 'END{print "03/16/06: " NR}'

で、できます。

{{comment}}

Splitting an output file based on it's size (UNIX) - jayend5000 (2006年03月17日 01時09分10秒)

6 GB を超えるファイルを扱おうとしたところ、4 GB で限界があることがわかりました。

shell で 4 GB を超えるファイルを扱うにはどうすればいいでしょうか?

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/109f1ef0b9fb5387/cf7cec8d95c6223b?hl=ja#cf7cec8d95c6223b


  • これは awk に関する質問ではないので、comp.unix.shell で議論してください。 - Ed Morton (2006年03月17日 01時09分30秒)

{{comment}}

Identify the nodes in the same level using a pattern - Karthik (2006年03月17日 01時01分03秒)

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

Level, ID, Rev,Name,Date
0, PRGCD338HL, 2, F_Program, Jan-10-2006
 1, PHCD3380229H2, 1, F_Placeholder, Feb-11-2006
  2, DSCD3380229H1, 1, F_DesignSolution, Jan-21-2006
   3, FDR0022904NPSM6, 1, F_DesignRep, Feb-11-2006
  1, PHCD3380229H4, 1, F_Placeholder, Jan-10-2006
  2, FDR0022904NPSM6, 1, F_DesignRep, Apr-01-2006
  2, FDR022904NPSM1, 1, F_DesignRep, Jan-21-2004
 1, PHCD3380229H3, 1, F_Boxholder, Jan-10-2002
  2, FDR0022904NPSM6, 1, F_DesignRep, Jan-31-2003
  2, FDR022904NPSM1, 1, F_DesignRep, Feb-11-2006
1, PHCD3380229H4, 1, F_Placeholder, Jan-10-2006
  2, PHCD3380229H4, 1, F_Placeholder, Jan-10-2006
   3, FDR0022904NPSM6, 1, F_DesignRep, Apr-01-2006
   3, FDR022904NPSM1, 1, F_DesignRep, Jan-21-2004

この特定のレベルのものを抜き出して、以下のようなファイルを得ます。

 2, DSCD3380229H1, 1, F_DesignSolution, Jan-21-2006

 2, FDR0022904NPSM6, 1, F_DesignRep, Apr-01-2006
 2, FDR022904NPSM1, 1, F_DesignRep, Jan-21-2004

  3, FDR0022904NPSM6, 1, F_DesignRep, Apr-01-2006
  3, FDR022904NPSM1, 1, F_DesignRep, Jan-21-2004

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

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/5476374035d6fff2/858e919d624c0b57?hl=ja#858e919d624c0b57


  • 以下のものを試してみてください。 - Ed Morton (2006年03月17日 01時06分26秒)
awk -F, '$4 ~ /F_Placeholder/ { phLevel = $1; next }
! phLevel { next }
$1 == phLevel + 1 { print; next }
{ print ""; phLevel = 0 }' file

{{comment}}

newbie: print fields of a record in one line - felix (2006年03月14日 00時48分21秒)

それぞれが \t で区切られた 1 行に出力しようとしています。

\n
x1
y1
a1 a2 a3
b1 b2 b3
c1 c2 c3
\n
x2
y2
d1 d2 d3
e1 e2 e3
\n
x3
y3
f1 f2 f3
g1 g2 g3
h1 h2 h3
i1 i2 i3
j1 j2 j3

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

\n
x1 y1 a1 a2 a3 b1 b2 b3 c1 c2 c3
\n
x2 y2 d1 d2 d3 e1 e2 e3
\n
...

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


  • 以下のようにしてできます。 - Ed Morton (2006年03月15日 00時40分39秒)
awk -v RS= '($1=$1)1' file
  • 以下のようにしてできます。 - Chris F.A. Johns (2006年03月15日 00時42分26秒)
awk 'BEGIN { RS = "" }
           { $1 = $1
              printf "%s\n\n", $0
           }'
  • $1 = $1 とはどういうことをしているのですか? - Grant (2006年03月15日 00時44分28秒)
  • 強制的に空行の RS をデフォルトの RS に変更しています。 - Ed Morton (2006年03月15日 00時45分23秒)

また、同時に FS を OFS に変換もしています。{{comment}}

Variable in awk command - Ditch Brodie (2006年03月14日 00時43分04秒)

awk を使った shell スクリプトのループを作っています。以下のようなもので、awk に変数を認識させたいのです。

.
.
.
for address in mail_to_list
do
   whois $address |\
   awk '{printf  ("%-53s    %-16s \n", $address, $2)}'
done
.
.
.

awk は $address を認識しません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/fff67c51dd87e360/04441234ceb1a5a4?hl=ja#04441234ceb1a5a4


  • 以下のようにします。 - Grant (2006年03月14日 00時43分27秒)
for address in mail_to_list
do
   whois $address |\
   awk -v address=$address '{printf  ("%-53s    %-16s \n", address, $2)}'
done
  • ワンクッション必要です。 - Chris F.A. Johns (2006年03月14日 00時44分56秒)
for address in mail_to_list
do
    printf "MAIL_TO_ADDRESS=%s\n" "$address"
    whois "$address"
done | awk '/^MAIL_TO_ADDRESS=/ {
              sub(/^MAIL_TO_ADDRESS=/, "")
              address=$0
              next }
            { printf  ("%-6s %-16s \n", address, $0) }'

{{comment}}

help with embedding in awk please - Mike (2006年03月12日 00時46分05秒)

awk 'BEGIN
       {theday=`date +%A -d $1`}
       END {print theday , $1}' testdates.csv

という awk スクリプトは動きますか?

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


  • 環境に依存すると思います。 - Janis Papanagnou (2006年03月12日 00時46分27秒)
awk -v datevar=`date ...` 'BEGIN { ...use datevar here... }'

または、

awk 'BEGIN { "date ..." | getline datevar ; ...use datevar here... }'

と書けますが、gawk では時間関数を持っているので、それを使うこともできるでしょう。

  • getline とパイプで以下のようにします。 - Patrick TJ McPhee? (2006年03月14日 00時38分44秒)
BEGIN { "date +%A -d " ARGV[1] | getline theday }

または、

 BEGIN { cmd = "date +%A -d " ARGV[1]
         cmd | getline theday
         close(cmd)
}

のようにします。

{{comment}}

awk script to convert dec to hex - bshah (2006年03月12日 00時37分41秒)

10 進数の IP アドレスを 16 進数にしたいのです。そこで、それぞれの項目をばらして、それぞれを 16 進数にします。

172 -> AC HEX
51 -> 33 HEX
34 -> 22 HEX
40 -> 28 HEX

最終的に "AC332228" とします。

n=0
hex=0
echo "Enter number in decimal format : "
read n
hex=`echo "obase=16;ibase=10; $n" | bc`
echo "$n is equivalent \"$hex\" in hexadecimal"

というスクリプトを作りましたが、awk でこれを行いたいのです。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/beba62c27ca9c256/6213e47f094b5c3b?hl=ja#6213e47f094b5c3b


  • 以下のようにします。 - Ed Morton (2006年03月12日 00時38分01秒)
$ awk -v dec="172.51.34.40" 'BEGIN{n=split(dec,d,".");for(i=1;i<=n;i++)
printf "%X",d[i];print ""}'
AC332228
  • 素晴らしいのですが、16 進数で 5 の場合には 05 としたいのです。 - bshah (2006年03月12日 00時39分17秒)
  • %X の代わりに %02X とすればいいのです。 - Harlan Grove (2006年03月12日 00時40分00秒)
  • 以下のような関数を考えてみました。 - Grant (2006年03月12日 00時41分10秒)
function dotquad2bin(q,   i, j, k)
{
        split(q, k, "."); i = 0
        for (j = 1; j <= 4; j++) { i = or(lshift(i, 8), and(k[j], 255)) }
        return i
}

これを以下のようにして使います。

printf "08X\n", dotquad2bin("128.51.34.40")

{{comment}}

syntax error - awk print lines between pattern - John Smith (2006年03月12日 00時30分33秒)

some text
some more text
-----------------------
text
more text
...
end of section
==================

のようなテキストがあります。

"-----------------------" と "======" の間のテキストを表示したいのです。

(/=+/ && stop == 1)   { exit }
stop == 1 { print }
/-+/ { stop = 1 }

というスクリプトを作ったのですが、エラーになります。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/796527f8669ae3be/d9eb4cf3db018d1c?hl=ja#d9eb4cf3db018d1c


  • 古い awk を使っていませんか? - Ed Morton (2006年03月12日 00時31分05秒)
  • 以下のようなスクリプトでできましたよ。 - Grant (2006年03月12日 00時31分42秒)
#!/usr/bin/gawk -f
#
/^-+$/ { ++go; next }
/^=+$/ { exit }
go { print }

# end
  • 以下のようにしてできます。 - Loki Harfagr (2006年03月12日 00時32分23秒)
$ awk '/--/,/==/' yourfile

{{comment}}

Don't understand printf - Salve Hakedal (2006年03月12日 00時24分17秒)

$ echo hei | awk -f test.awk -v valg=m or u

のようにして、以下のスクリプトを実行しました。

$ cat test.awk
#!/usr/bin/gawk

{
sum = 34579
}
END {
if (valg ~ /m/) {
    print  ""
    derav_mva = sum * 25 / 125
    printf "            derav mva. %.f\n", derav_mva
    mellomrom = 71 - length(sum)
    printf "A betale %*s%.f\n", mellomrom, " ", sum
    }
if (valg ~ /u/) {
    print  ""
    pluss_mva = sum / 4
    printf "                + mva. %.f\n", pluss_mva
    full_sum = sum + pluss_mva
    mellomrom = 71 - length(full_sum)
    printf "A betale %*s%.f\n", mellomrom, " ", full_sum
    }
}

しかし、m と u で同じ長さになりません。

http://groups.google.co.jp/group/comp.lang.awk/browse_thread/thread/7518c9966f89318e/09160f3a3ca3aab8?hl=ja#09160f3a3ca3aab8


  • % の後に幅を指定していないためです。 - Grant (2006年03月12日 00時25分55秒)

例えば、以下のようにします。

printf "%20s %6.2f\n", "+ mva.", pluss_mva

{{comment}}

newbie help with first program - Fred (2006年02月26日 02時42分58秒)

ファイルを読んで、配列に格納します。

BEGIN\
{
list_file=ARGV[1]

 for(x=1; (getline var[x] < list_file) > 0; x++)
  {print ""
  }
  close(ARGV[1])
  ARGV[1] = ""
}
{
    i==1
    for(i=1; i<=x;i++)
    {print var[i]
   }
}

ループに入って抜け出せません。

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


  • awk の標準アクションだと以下のようになります。 - Juergen Kahrs (2006年02月26日 02時43分37秒)
{var[NR] = $1; print var[NR] }
  • 以下のようなもので動作します。 - Ted Davis (2006年02月26日 02時44分17秒)
 {
   Array[ NR ] = $0
 }
 END{
   for( x = 1; x <= NR; x++) print Array[ x ]
 }
  • 以下のようにしてできます。 - William James (2006年02月26日 02時45分06秒)

{ var[NR] = $0 }END \{ for (i=1; i in var; i++)

   print var[i]

}

  • 私はデータベースの読み込みで以下のようにしています。 - Grant (2006年02月26日 02時46分45秒)
function read_bogon_data(   k)
{
        if (!quiet) printf "%s reading %s", strftime("%F-%T"), bogonfil
        if ((getline < bogonfil) > 0) {
                if ($2 ~ /List/ && $5 ~ /bogons/) {
                        bgsize = 0
                        while ((getline < bogonfil) > 0) {
                                if (/^$/) continue
                                if (/^#.*$/) continue
                                # format: 0.0.0.0/7
                                split($0, k, "/")
                                bogondat[++bgsize] = sprintf("%10d %d", \
                                        dotquad2bin(k[1]), k[2])
                        }
                        if (!quiet) printf ", %d records.\n", bgsize
                }
                else {
                        if (!quiet) print " datafile not recognised"; exit 2
                }
        }
        else {
                if (!quiet) print " datafile not found"; exit 3
        }
        close(bogonfil)
        if (dataload == 2) exit 1 # for timing database load
}
  • これは初心者への例としては適していません。 - William James (2006年02月26日 02時48分05秒)
  1. getline を使っている
  2. インデントしすぎて見づらい (2 スペースが適当)
  3. グローバル変数が多すぎ
  4. printf の多用しすぎ
  5. 変数名が省略されていて分かりにくい
  • 以下のようにしました。 - Fred (2006年02月26日 02時52分02秒)
{
{FIELDWIDTHS = "8 64"}
   { if ($1 == "PBAR*   ")
      # need to insert a line but not now should be at "current line +
4"

    else print $1,$2
  }
}
  • getline には以下のような副作用があります。 - Ed Morton (2006年02月26日 02時54分04秒)
Variant                Effect
getline                Sets $0, NF, FNR, and NR
getline var            Sets var, FNR, and NR
getline < file         Sets $0 and NF
getline var < file     Sets var
command | getline      Sets $0 and NF
command | getline var  Sets var

{{comment}}

newbie help with first program - Fred (2006年02月26日 02時42分26秒)

ファイルを読んで、配列に格納します。

BEGIN\
{
list_file=ARGV[1]

 for(x=1; (getline var[x] < list_file) > 0; x++)
  {print ""
  }
  close(ARGV[1])
  ARGV[1] = ""
}
{
    i==1
    for(i=1; i<=x;i++)
    {print var[i]
   }
}

ループに入って抜け出せません。

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


{{comment}}

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


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