AWK ogurisu@lagendra.s.kanazawa-u.ac.jp 2001 1 8 ( ): 1 2002 10 10 ( ): 1.1 AWK C Java AWK perl, ruby web AWK A4 A4 1 ( :p) 2 1 AWK 2 2 AWK 4 2.1 AWK............................... 5 2.2 AWK NR NF..................................... 6 2.3 AWK................................. 8 2.4 AWK.......................................... 9 2.4.1.......................................... 10 2.4.2........................................ 10 2.4.3 *..................................... 10 2.4.4 ˆ $................................... 11 2.4.5 [ ].................................... 11 2.4.6 ( ).................................... 12 1 1 1.1 2 1
2.4.7 \.................................... 12 2.4.8.................................. 13 2.5 AWK.................................... 14 2.6 AWK............................... 15 3 AWK 15 3.1 AWK.................................... 15 3.2 AWK............................. 16 3.3 AWK............................... 18 3.4 AWK printf....................................... 19 3.5 AWK statements................................. 20 3.6 AWK.......................................... 22 3.7 AWK :..................................... 23 3.7.1.................................... 24 3.7.2.............................. 30 3.8 AWK...................................... 32 4 AWK 35 5 AWK 36 5.1 0 :................................. 36 5.2 1 :.................................... 37 5.3 2 :............................... 38 5.4 3 :................................ 39 5.5 5 :................................... 42 5.6 Mule/Emacs...................................... 44 6 44 1 AWK 1? 3 ls -l ls -l 101572 -r--r--r-- 1 ogurisu ogurisu 280396 5 20 1999 auctex-9.9p.tar.gz -r--r--r-- 1 ogurisu ogurisu 169498 5 26 1999 cmail-2.59.13.tar.gz -rw-r--r-- 1 ogurisu ogurisu 1319271 10 24 08:32 gnuplot_3.7.tar.gz -rw-r--r-- 1 ogurisu ogurisu 822766 9 27 18:59 ruby-1.6.1.tar.gz -r--r--r-- 1 ogurisu ogurisu 51458 7 15 1998 sh-text.tar.gz -r--r--r-- 1 ogurisu ogurisu 257496 5 20 1999 yatex1.66.tar.gz 3 2
1.4 ( 1,400,000 ) 1? ( )? AWK 2900885 ls -l gawk {a+=$5; END {print a; 2900885 gawk AWK 4 {a+=$5; END {print a; AWK sum.awk # sum.awk: { END { a += $5; print a; gawk a+=$5; END print a; gawk -f sum.awk 5 ls -l gawk -f sum.awk 2900885 AWK C Fortran ls 6 sin(x) [0, π] 100 C sin.awk # sin.awk: BEGIN { for (i = 0; i <= 100; i++) printf("1.6f\n", sin(i*3.1415/100)); 4 gawk GNU(FSF ) AWK Linux AWK gawk /usr/local/bin/ /usr/bin/ 5 gawk -f 6 3
gawk -f./sin.awk C? C 7 AWK 3 K C Kerninghan A Aho W Weinberger 2 AWK AWK miyabe.data EUC 8 743 98/02/01-22-8 505 96/09/01-22-6 1650 96/10/10 1456 96/10/30 819 98/10/30 552 98/09/01-22-9 1300 97/11/28 750 90/03/01 552 98/11/18-32-1 466 97/02/01-22-7 563 96/07/15-42-1 1068 92/06/10 1165 94/04/01 1800 97/11/15 505 94/10/20-13-1 466 95/12/10-17-2 819 97/05/25 553 97/03/17-14-1 796 95/09/25 534 92/12/25 M- -1-1 1359 96/01/30 695 97/09/15-42-2 1500 98/06/30 427 94/12/01-22-3 427 95/09/01-22-5 505 93/01/25-22-1 7 C C AWK 8 jgawk 4
895 97/10/25 1200 98/06/01 660 95/02/01-22-4 699 93/09/25-22-2 369 93/01/10-17-1 2.1 AWK AWK $1 $2 $3... 743 98/02/01-22-8 $1= $2=743 $3=98/02/01 $4= $5= $6= -22-8 {print $1; AWK $1 (print) gawk {print $1; miyabe.data ( ) { $2 gawk {print $2; miyabe.data 743 505 1650 1456 819 552 750 552 5
( ) ( ) 819 98/10/30 552 98/09/01-22-9 1300 97/11/28 ( ) 2 $2 2 ( 2.6 ) miyabe.new $1 $3 print $1 $3 gawk {print $1 $3; miyabe.new 98/02/01 96/09/01 96/10/10 ( ) $1 $3, gawk {print $1, $3; miyabe.new 98/02/01 96/09/01 96/10/10 ( ) 2.2 AWK NR NF AWK AWK NR NF NR gawk {print NR, $1, $3; miyabe.new 1 6
2 98/02/01 3 96/09/01 4 96/10/10 ( ) $0 (cat -n miyabe.new ) gawk {print NR, $0; miyabe.new 1 2 743 98/02/01-22-8 3 505 96/09/01-22-6 4 1650 96/10/10 ( ) NR NR 3 3 { gawk NR == 3 {print NR, $0; miyabe.new 3 505 96/09/01-22-6 1 3 gawk NR <= 3 {print NR, $0; miyabe.new 1 2 743 98/02/01-22-8 3 505 96/09/01-22-6 &&! gawk NR >4 && NR < 7 {print NR, $0 miyabe.new 5 1456 96/10/30 6 819 98/10/30 gawk NR == 2 NR == 4 {print NR, $0 miyabe.new 2 743 98/02/01-22-8 4 1650 96/10/10 NR!= 1 gawk!(nr == 1) {print NR, $0 miyabe.new head 2 743 98/02/01-22-8 3 505 96/09/01-22-6 4 1650 96/10/10 5 1456 96/10/30 ( ) NF 7
2.3 AWK { / 9 gawk / / {print $0; miyabe.new 563 96/07/15-42-1 695 97/09/15-42-2 $0 print $0 gawk / / {print; miyabe.new 563 96/07/15-42-1 695 97/09/15-42-2 {print; / / gawk / / miyabe.new 563 96/07/15-42-1 695 97/09/15-42-2 96 /96/ gawk /96/ miyabe.new 505 96/09/01-22-6 1650 96/10/10 1456 96/10/30 563 96/07/15-42-1 796 95/09/25 1359 96/01/30 96 95? 796 96 AWK 96 96 / / / /96// / \ /96\// 9 ( 2.4 ) 8
gawk /96\// miyabe.new 505 96/09/01-22-6 1650 96/10/10 1456 96/10/30 563 96/07/15-42-1 1359 96/01/30 \ gawk /96// miyabe.new gawk: cmd. line:1: /96// gawk: cmd. line:1: ^ syntax error gawk: cmd. line:1: /96// gawk: cmd. line:1: ^ unexpected newline or end of string / / &&! gawk /96\// /97\// miyabe.new 505 96/09/01-22-6 1650 96/10/10 1456 96/10/30 1300 97/11/28 466 97/02/01-22-7 563 96/07/15-42-1 1800 97/11/15 819 97/05/25 553 97/03/17-14-1 1359 96/01/30 ( ) NR ( 2.2 ) {print; gawk NR == 2 miyabe.new 743 98/02/01-22-8 2.4 AWK / mule vi grep sed UNIX /abc123/ 9
abc123 AWK gawk /abc/ file file abc /abc/ 10. * +? ^ $ [ ] ( ) \ 2.4.1 /abc def/ abc def gawk /abc def/ file file abc def /abc def 0123/ 2.4.2. ( ) /a...b/ 3 a b aaaab a012b a b ( 3 ) gawk /a...c/ file file 3 a b 2.4.3 * 0 /ab*c/ ac abc abbc abbbc abbbbc + 1 10 /abc/ abc abc abc abc / 10
/ab+c/ abc abbc abbbc abbbbc * ac? 0 1 /ab?c/ ac abc. * /a.*c/ a c 0 2.4.4 ˆ $ ^ $ /^abc/ 3 abc "abcdef" "0abcdef" /abc$/ 3 abc "0123abc" "abcdef" /^$/! gawk!/^$/ file file ( abcd0123 ) /var/mail/abcd0123 gawk /^From/ /var/mail/abcd0123 From 2.4.5 [ ] [ ] /199[0123456789]/ 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 11
/199[0-9]/ /[1-9][0-9]*/ 1 [ ] ^ ^ [ ] /[^0-9]/ 0 1 2 3 4 5 6 7 8 9 /a[^ ]+b/ a b 1 ^ 2 /[a-z^]/ ^ 2.4.6 ( ) ( ) /ab(cd)*/ ab abcd abcdcd abcdcdcd... /(a b)cd/ acd bcd /((a b)?cd def)/ cd acd bcd def 2.4.7 \. * +? ^ $ [ ] ( ) /./ \ 12
/\./ \ \ /\\/. * 0 + 1? 1 ^ $ [ ] ( ) \ 2.4.8 \ C \t \n /[ \t\f\n\r\v]/ AWK /[ \t]/ \\ \a ASCII BEL \b \f \n \r ( ) \t \v \x[0-9a-f]+ \x 16 "\x41" A \ddd 1 2 3 8 "\101" A \c c 13
2.5 AWK BEGIN END gawk BEGIN { 1 { END { 2 miyabe.new AWK 1 1 2 BEGIN END gawk { END { 2 miyabe.new gawk BEGIN { 1 { miyabe.new gawk { miyabe.new / / NR gawk /96\// { END { 2 miyabe.new gawk BEGIN { 1 /96\// { miyabe.new gawk /96\// { miyabe.new miyabe.new? all gawk BEGIN {all=0; { all += $2; END { print all; miyabe.new 25798 BEGIN all 0 all $2 ( ) += C all END all 1.05 gawk BEGIN {all=0; { all += $2; END { print all*1.05; miyabe.new 27087.9 96 / / gawk BEGIN {all=0; /96\// { all += $2; END { print all*1.05; miyabe.new 5809.65 BEGIN 0 AWK 0 BEGIN {all=0; gawk /96\// { all += $2; END { print all*1.05; miyabe.new 5809.65 14
2.6 AWK?,, miyabe.csv AWK -F, gawk -F, { print $1, $3; miyabe.csv 98/02/01 96/09/01 96/10/10 96/10/30 98/10/30 98/09/01 97/11/28 90/03/01 98/11/18 ( ) -F BEGIN (Field Separator ) FS gawk BEGIN { FS=","; { print $1, $3; miyabe.csv ( 3 ) (,) CSV (comma-separated value) 11 3 AWK AWK 3.1 AWK gawk BEGIN { FS=","; /96\// { print $1, $3; miyabe.csv 11 15
fs.awk # fs.awk:, BEGIN { FS = ","; /96\// { print $1, $3; gawk -f gawk -f./fs.awk miyabe.csv 96/09/01 96/10/10 96/10/30 96/07/15 96/01/30 AWK AWK AWK.awk mule/emacs AWK 12 #!/usr/local/bin/awk -f # fs.0.awk: BEGIN { FS = ","; /96\// { print $1, $3; 3.2 AWK fs.awk 1 2 # fs.awk:, BEGIN { FS = ","; 12 AWK M-x awk-mode 16
/96\// { print $1, $3; # 1 chmod chmod 755 fs.awk ls -l fs.awk -rwxr-xr-x 1 ogurisu ogurisu 120 Dec 10 02:18 fs.awk chmod +x fs.awk awk fs.awk./fs.awk sample.cvs UNIX OS 2 #! #! ( /usr/local/bin/gawk -f) 13 2./fs.awk sample.cvs /usr/local/bin/gawk -f./fs.awk sample.cvs UNIX bin mkdir ~/bin ~/.cshrc set path = (~/bin $path) bash ~/.profile ~/.bashrc PATH=~/bin:$PATH chmod ~/bin 13 gawk /usr/local/bin /usr/bin/gawk 17
3.3 AWK AWK ( ) ( 3.8 ) AWK pattern { action statements BEGIN END / / NR /96\// { print $1, $3; /96/ { print $1, $3; gawk {print $1, $3; miyabe.new gawk /96\// miyabe.new {print; ; 95 96 gawk /95\//; /96\// miyabe.new 505 96/09/01-22-6 1650 96/10/10 1456 96/10/30 563 96/07/15-42-1 466 95/12/10-17-2 796 95/09/25 1359 96/01/30 427 95/09/01-22-5 660 95/02/01-22-4 gawk /9[56]\// miyabe.new {print; gawk /95\// {print $1; /96\// {print $3; miyabe.new 96/09/01 96/10/10 96/10/30 96/07/15 18
96/01/30 95 ($) 96 ($3) # p_and_a.awk: /95\// { print $1; /96\// { print $3; BEGIN END 3.4 AWK printf 14 C [a-za-z][a-za-z0-9]* C AWK ( ) AWK AWK C printf sin.awk # sin.awk: BEGIN { for (i = 0; i <= 100; i++) printf("1.6f\n", sin(i*3.1415/100)); i "1.6f\n" printf f C BEGIN BEGIN ( ) 14 19
3.5 AWK statements C expr atan2(y,x) cos(expr) exp(expr) int(expr) log(expr) rand() sin(expr) sqrt(expr) srand(expr) y/x ( ) ( ) 0 1 ( ) expr expr gsub(r,s,t) index(s,t) length(s) match(s,r) split(s,a,r) sprintf(fmt,list) sub(r,s,t) substr(s,i,n) tolower(str) toupper(str) t r s t $0 s t t 0 s s $0 s r 0 RSTART RLENGT s r a r FS a fmt list gsub() s i n n i str str gsub gawk {gsub(/ /, " "); print; miyabe.csv,,,,,,743,98/02/01,, -22-8,,505,96/09/01,, -22-6,,1650,96/10/10,, ( ) 20
ls AWK-INTRO.AUX FS.0.AWK MAKEFILE SAMPLE1.DATA SEC3.TEX AWK-INTRO.DVI FS.AWK MAKEFILE.FINAL SEC0.TEX SIN.AWK AWK-INTRO.LOG GSUB.AWK MIYABE.CSV SEC1.TEX SUM.AWK AWK-INTRO.TEX KUKU.AWK MIYABE.DATA SEC2.TEX mv AWK-INTRO.AUX awk-intro.aux 15 ls gawk {print "mv -v", $0, tolower($0); mv -v AWK-INTRO.AUX awk-intro.aux mv -v AWK-INTRO.DVI awk-intro.dvi mv -v AWK-INTRO.LOG awk-intro.log mv -v AWK-INTRO.TEX awk-intro.tex mv -v FS.0.AWK fs.0.awk ( ) mv sh 16 ls gawk {print "mv -v", $0, tolower($0); sh AWK-INTRO.AUX -> awk-intro.aux AWK-INTRO.DVI -> awk-intro.dvi AWK-INTRO.LOG -> awk-intro.log AWK-INTRO.TEX -> awk-intro.tex FS.0.AWK -> fs.0.awk ls ( ) awk-intro.aux fs.0.awk makefile sample1.data sec3.tex awk-intro.dvi fs.awk makefile.final sec0.tex sin.awk awk-intro.log gsub.awk miyabe.csv sec1.tex sum.awk awk-intro.tex kuku.awk miyabe.data sec2.tex AWK sh (sh ) sub mv -v 15 ruby tr UNIX 16 sh sh 21
3.6 AWK AWK if while for if (condition) statement [ else statement ] while (condition) statement do statement while (condition) for (expr1; expr2; expr3) statement sin.awk C # sin.awk: BEGIN { for (i = 0; i <= 100; i++) printf("1.6f\n", sin(i*3.1415/100)); < > <= >= ==!= &&! C nf.awk ( ) 6 # nf.awk: 6 { if (NF > 6) { print NR " (" NF " :)", $0; else if (NF < 6) { print NR " (" NF " :)", $0; else { print NR " "; # C reg.awk ~ # reg.awk: BEGIN { FS = ","; { if ($0 ~ /96\//) print $1, $3; # 22
reg2.awk # reg2.awk: (2) BEGIN { FS = ","; /96\/ { print $1, $3; { C kuku.awk # kuku.awk: BEGIN { for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) printf("3d", i * j); printf("\n");./kuku.awk 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27 0 4 8 12 16 20 24 28 32 36 0 5 10 15 20 25 30 35 40 45 0 6 12 18 24 30 36 42 48 54 0 7 14 21 28 35 42 49 56 63 0 8 16 24 32 40 48 56 64 72 0 9 18 27 36 45 54 63 72 81 C 3.7 AWK : AWK C 23
3.7.1 1 C # array_1dim.awk: 0 9 BEGIN { for (i = 0; i < 10; i++) a[i] = i; sum = 0; for (i = 0; i < 10; i++) sum += a[i]; print sum; array-1dim.awk 2 C, array-2dim.awk # array_2dim.awk: BEGIN { # A a[0,0] = 1; a[0,1] = 2; a[0,2] = 3; a[0,3] = 4; a[1,0] = 1; a[1,1] = 2; a[1,2] = 3; a[1,3] = 4; a[2,0] = 1; a[2,1] = 1; a[2,2] = 3; a[2,3] = 4; a[3,0] = 1; a[3,1] = 1; a[3,2] = 1; a[3,3] = 4; # B b[0,0] = 0; b[0,1] = 0; b[0,2] = 0; b[0,3] = 1; b[1,0] = 0; b[1,1] = 0; b[1,2] = 1; b[1,3] = 0; b[2,0] = 0; b[2,1] = 1; b[2,2] = 0; b[2,3] = 0; b[3,0] = 1; b[3,1] = 0; b[3,2] = 0; b[3,3] = 0; # : C = AB for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) { c[i,j] = 0; for (k = 0; k < 4; k++) c[i,j] += a[i,k] * b[k,j]; # print "A="; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf("4d", a[i,j]); 24
print ""; # print "B="; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf("4d", b[i,j]); print ""; # print "AB="; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf("4d", c[i,j]); print ""; #./array-2dim.awk A= 1 2 3 4 1 2 3 4 1 1 3 4 1 1 1 4 B= 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 AB= 4 3 2 1 4 3 2 1 4 3 1 1 4 1 1 1 matrix.data array-read.awk 1 2 3 4 5 6 7 8 9 row +1 NF 25
# array_read.awk: { row++; # column = NF; # for (j = 1; j <= column; j++) a[row,j] = $j; END { for (i = 1; i <= row; i++) { # for (j = 1; j <= column; j++) printf("a[d,d]=d, ", i, j, a[i,j]); print "";./array-read.awk matrix.data a[1,1]=1, a[1,2]=2, a[1,3]=3, a[2,1]=4, a[2,2]=5, a[2,3]=6, a[3,1]=7, a[3,2]=8, a[3,3]=9, matrix2.data 2 array-read2.awk # # # 1 2 3 4 5 6 7 8 9 # 0 0 1 0 1 0 1 0 0 # 2 a[1,i,j] a[2,i,j] c[i,j]./array-read2.awk matrix2.data # 1 : # 1 2 3 # 4 5 6 26
# 7 8 9 # 2 : # 0 0 1 # 0 1 0 # 1 0 0 # 3 2 1 6 5 4 9 8 7 array-read1.awk array-read2.awk AWK 2 (csh bash) ; command1 command2 command3 command1; command2; command3 2./array-read2.awk matrix2.data; echo;./array-read2.awk matrix2.data # 1 : # 1 2 3 # 4 5 6 # 7 8 9 # 2 : # 0 0 1 # 0 1 0 # 1 0 0 # 3 2 1 6 5 4 9 8 7 # 1 : # 1 2 3 # 4 5 6 # 7 8 9 # 2 : # 0 0 1 # 0 1 0 # 1 0 0 # 27
3 2 1 6 5 4 9 8 7 2 echo 17 array-read2.awk array-read2.awk (./array-read2.awk matrix2.data; echo; \./array-read2.awk matrix2.data)./array-read2.awk # 1 : # 3 2 1 # 6 5 4 # 9 8 7 # 2 : # 3 2 1 # 6 5 4 # 9 8 7 # 30 24 18 84 69 54 138 114 90 command1; command2; command3 ; 1 output ( ) (command1; command2; command3) > output (command1; command2; command3) other_command \ bash tcsh zsh \ (command1; command2; \ command3) other_command array-read2.awk # array_read2.awk: BEGIN { num = 1; # num 17 echo 28
NF == 0 { num = 2; row = 0; # (! /^\#/) && NF > 0 { # row++; # column = NF; # for (j = 1; j <= column; j++) a[num, row, j] = $j; END { for (k = 1; k <= 2; k++) { print "# " k " :" for (i = 1; i <= row; i++) { # printf("# "); for (j = 1; j <= column; j++) printf("d ", a[k, i,j]); print ""; # row == column for (i = 1; i <= row; i++) for (j = 1; j <= row; j++) { c[i,j] = 0; for (k = 1; k <= row; k++) c[i,j] += a[1,i,k] * a[2,k,j]; print "# " for (i = 1; i <= row; i++) { for (j = 1; j <= column; j++) printf("d ", c[i,j]); print ""; # AWK 29
3.7.2 AWK C array-str.awk miyabe.csv # array_str.awk: BEGIN { FS = ","; { publisher[$4] += 1; # $4= END { for (i in publisher) print i " " publisher[i] " "; ($4) publisher 0 publisher[" "] 1 publisher[" "] publisher END for for ( in ) { ; 1./array-str.awk miyabe.csv 1 2 5 1 2 1 30
2 2 1 1 10 1 3 if in if ( in ) { ; array-str2.awk # array_str2.awk: BEGIN { FS = ","; { publisher[$4] += 1; # $4= END { name = " "; if (name in publisher) print name " " publisher[name] " ";./array-str2.awk miyabe.csv 10 array-str3.awk AWK # array_str3.awk: BEGIN { FS = ","; 31
{ publisher[$4] = publisher[$4] " " $1 " "; # $1 END { for (i in publisher) print i " " publisher[i] " ";./array-str3.awk miyabe.csv ( ) 3.8 AWK AWK function ( ) { awk awk... awk return return func.awk # func.awk: BEGIN { a = "OK"; b = "OK"; c = "OK"; print foo(1,2); print a, b, c; # a,b,c print bar("awk ", " "); print a, b, c; # a,b,c print "4! == " recursive(4); # 4! == 24 32
function foo(a, b, c) { # c c = a + b; return c; function bar(a, b, c) { c = a b; return c; function recursive(a) { if (a <= 1) return 1; else return a * recursive(a-1); # foo a b bar a b./func.awk 3 OK OK OK AWK OK OK OK 4! == 24 a b c AWK C foo bar c AWK AWK AWK a,b c 2 C AWK C # func2.awk: BEGIN { 33
for (i = 0; i < 4; i++) a[i] = i; print " "; for (i = 0; i < 4; i++) print i, a[i]; foo(a); print " foo?"; for (i = 0; i < 4; i++) print i, a[i]; b["awk"] = "AWK"; b["perl"] = "PERL"; b["ruby"] = "RUBY"; print " "; print b["awk"], b["perl"], b["ruby"]; bar(b); print " bar "; print b["awk"], b["perl"], b["ruby"]; function foo(a, i) { for (i = 0; i < 4; i++) a[i] = -i; function bar(a) { a["awk"] = reverse(a["awk"]); a["perl"] = reverse(a["perl"]); a["ruby"] = reverse(a["ruby"]); # str ("abc" --> "cba") # str function reverse(str, a, i, j, t) { j = length(str); if (j <= 0) return; split(str, a, //); # for (i = 0; i < j/2; i++) { # t = a[i]; a[i] = a[j-i]; a[j-i] = t; t = ""; for (i = 0; i < j; i++) t = t a[i]; # return t; 34
func2.awk./func2.awk 0 0 1 1 2 2 3 3 foo? 0 0 1-1 2-2 3-3 AWK PERL RUBY bar KWA LREP YBUR 4 AWK AWK one liners gawk datafile gawk { if (length($0) > max) max = length($0) END { print max datafile datafile gawk {if (length($0)>m) m=length($0) END{print m datafile max m gawk length($0) > 80 datafile 80 gawk NF > 0 datafile gawk BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) 0 100 7 35
gawk END { print NR datafile gawk NR 2 == 0 datafile C ls -lg FILES awk { x += $5 ; END { print "total bytes: " x FILES ls -lg FILES awk { x += $5 END { print "total K-bytes: " (x + 1023)/1024 5 AWK MS-Excel 18 AWK 19 mule/emacs 5.1 0 : AWK AWK data.0 2300 600 1000 3210 800 1050 18 OS 19 36
kakei0.awk #kakei0.awk: { total += $1; END { print " " total " "; ( 3.2 ) kakei0.awk data.0 8960 20 5.2 1 : 0 data.0.date 11 25 2300 600 1000 11 26 3210 800 1050 0 kakei0.awk data.0.date 8982 20 37
11 AWK (data.1) ; ;11 25 2300 ; 600 ; 1000 ; ; ;11 26 3210 ; 800 ; 1050 ; kakei1.awk ; #kakei1.awk: 1 # # ; # # # ; BEGIN { FS = ";"; { total += $1; END { print " " total " "; kakei1.awk data.1 8960 5.3 2 : (data.2) 38
11 25 ; 2300; ; 600 ; 1000 11 26 ; 3210 ; 800 ; 1050 kakei2.awk #kakei2.awk: 2 # # ; # # # ; ; BEGIN { FS = ";"; { total += $2; END { print " " total " "; kakei2.awk data.2 8960 5.4 3 : 3 4 (data.3) 11 25 39
; 2300; ; 600; ; 1000; 11 26 ; 3210; ; 800; ; 1050; kakei3.awk 3 #kakei3.awk: 3 # # # # # ; ; ; # BEGIN { FS = ";"; NF >= 2 { total += $2; if (length($3) > 0) { class[$3] += $2; else { class["none"] += $2; # END { print " " total " "; print " " for (i in class) print "\t" i " " class[i] " "; kakei3.awk data.3 8960 40
NONE 1050 5510 800 600 1000 2 ; (kakei4.awk) gsub ( 3.5 ) NONE NONE #kakei4.awk: 4 # # # # ; ; ; # BEGIN { FS = ";"; NF >= 2 { gsub(/[ \t]+/, ""); total += $2; if (length($3) > 0) { class[$3] += $2; else { class["none"] += $2; # END { print " " total " "; print " " for (i in class) if (i == "NONE") print "\t " class[i] " "; else print "\t" i " " class[i] " "; 41
kakei4.awk data.3 8960 1050 1400 5510 1000 5.5 5 :? 1 0 (kakei5.awk) #kakei5.awk: 5 : # # # # ; ; ; # BEGIN { FS = ";"; /^\s*[0-9]+ [0-9]+ / { dtotal = 0; for (i in dclass) dclass[i] = 0; # # NF >= 2 { gsub(/[ \t]+/, ""); total += $2; dtotal += $2; if (length($3) > 0) { class[$3] += $2; dclass[$3] += $2; else { class["none"] += $2; # 42
dclass["none"] += $2; # END { print " " total " "; print " " for (i in class) if (i == "NONE") print "\t " class[i] " "; else print "\t" i " " class[i] " "; print ""; print " " dtotal " "; print " " for (i in dclass) if (i == "NONE") print "\t " dclass[i] " "; else print "\t" i " " dclass[i] " "; kakei5.awk datafile 8960 1050 1400 5510 1000 5060 1050 800 3210 0 43
5.6 Mule/Emacs mule/emacs (kakei.el) ~/.emacs M-x kakei ;; ;; emacs-lisp ;; (defvar kakei-script "kakei.awk" " ") (defun kakei () (interactive) (shell-command-on-region (point-min) (point-max) kakei-script)) "kakei.awk" ( 3.2 ) ( ~/bin) 6 90 ( ) 100 21 AWK AWK 4 1. UNIX ( ) 2. AWK 256 ( ) 3. AWK () 4. GNU AWK AWK AWK GNU AWK gawk web perl ruby AWK AWK perl ruby AWK perl ruby 22 ruby web 21 22 ruby 44