2.4.7 \ AWK AWK......

Similar documents
( ) Shift JIS ( ) ASCII ASCII ( ) 8bit = 1 Byte JIS(Japan Industrial Standard) X 0201 (X ) 2 Byte JIS ISO-2022-JP, Shift JIS, EUC 1 Byte 2 By

コンピュータ概論

syspro-0405.ppt

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

¥¤¥ó¥¿¡¼¥Í¥Ã¥È·×¬¤È¥Ç¡¼¥¿²òÀÏ Âè11²ó

TC5.ids

I117 II I117 PROGRAMMING PRACTICE II SCRIPT LANGUAGE 1 Research Center for Advanced Computing Infrastructure (RCACI) / Yasuhiro Ohara

Windows Cygwin Mac *1 Emacs Ruby ( ) 1 Cygwin Bash Cygwin Windows Cygwin Cygwin Mac 1 Mac 1.2 *2 ls *3 *1 OS Linux *2 *3 Enter ( ) 2

GNU Emacs GNU Emacs

Java updated

2002 awk Aho,Weinberger,Kernighan DFA awk Brian Kernighan DFA GNU awk Arnold Robbins DFA NFA MKS awk Mortice Kern Systems POSIX NFA mawk Mike Brennan

joho12.ppt

haskell.gby

(Basic Theory of Information Processing) 1

bash on Ubuntu on Windows bash on Ubuntu on Windows bash on Ubuntu on Windows bash on Ubuntu on Windows bash on Ubuntu on Windows ˆ Windows10 64bit Wi

K-BASIC 1st: ユニケージ基礎編(前編)

Taro-cshプログラミングの応用.jt

2 1. Ubuntu 1.1 OS OS OS ( OS ) OS ( OS ) VMware Player VMware Player jp/download/player/ URL VMware Plaeyr VMware

Asterisk PBX 不正利用防止


(2 Linux Mozilla [ ] [ ] [ ] [ ] URL 2 qkc, nkc ~/.cshrc (emacs 2 set path=($path /usr/meiji/pub/linux/bin tcsh b

C言語によるアルゴリズムとデータ構造

Microsoft Word - C.....u.K...doc

2 Windows 10 *1 3 Linux 3.1 Windows Bash on Ubuntu on Windows cygwin MacOS Linux OS Ubuntu OS Linux OS 1 GUI Windows Explorer Mac Finder 1 GUI

16soukatsu_p1_40.ai

-2 gnuplot( ) j ( ) gnuplot /shell/myscript 1

LAN Copyright c Daikoku Manabu This tutorial is licensed under a Creative Commons Attribution 2.1 Japan License

PC Windows 95, Windows 98, Windows NT, Windows 2000, MS-DOS, UNIX CPU

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

2005 D Pascal CASL ( ) Pascal C 3. A A Pascal TA TA TA

parser.y 3. node.rb 4. CD-ROM

Windows [ ] [ (R)..] cmd [OK] Z:\> mkdir progi [Enter] \ ) mkdir progi ) (command ) help [Enter] help ( help ) mkdir make directory Windows ) mkdir mk

UNIX

II ( ) prog8-1.c s1542h017%./prog8-1 1 => 35 Hiroshi 2 => 23 Koji 3 => 67 Satoshi 4 => 87 Junko 5 => 64 Ichiro 6 => 89 Mari 7 => 73 D

¥¤¥ó¥¿¡¼¥Í¥Ã¥È·×¬¤È¥Ç¡¼¥¿²òÀÏ Âè2²ó

X Window System X X &

新・明解Java入門

: CR (0x0d) LF (0x0a) line separator CR Mac LF UNIX CR+LF MS-DOS WINDOWS Japan Advanced Institute of Science and Technology

2011 D Pascal CASL II ( ) Pascal C 3. A A Pascal TA TA enshu-

新版明解C言語入門編

Unix * 3 PC 2 Linux, Mac *4 Windows Cygwin Cygwin gnuplot Cygwin unix emulator online gnuplot *5 matplotlib *6 SuperMongo *7 gnuplot gnuplot OS *8 Uni

P02.ppt

slice00_install.dvi

1 (1) vs. (2) (2) (a)(c) (a) (b) (c) 31 2 (a) (b) (c) LENCHAR

明解Java入門編

csj-report.pdf

解きながら学ぶC言語

C

新・明解C言語で学ぶアルゴリズムとデータ構造

離散数理工学 第 2回 数え上げの基礎:漸化式の立て方

Jacques Garrigue

2009 D Pascal CASL II ( ) Pascal C 3. A A Pascal TA TA

スパコンに通じる並列プログラミングの基礎

unix.dvi

スパコンに通じる並列プログラミングの基礎

untitled

untitled

sed, awk 生物学で公開されるデータの形式の多くがascii text fasta, fastq, sam, bed, wig, その他独自の形式,... プログラムの入力や出力を整形する作業が生じる パールのようなもの に頼る Perl, Python, Ruby,... ( 小さな )gl


C¥×¥í¥°¥é¥ß¥ó¥° ÆþÌç

double float

UNIX

スパコンに通じる並列プログラミングの基礎

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

ex01.dvi

K227 Java 2

Transcription:

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