📄 awkcode.txt
字号:
info ' countriesinfo.ans awk 'info.ans BEGIN { FS = "\t"; pat = ARGV[1]; ARGV[1] = "-" }info.ans $1 ~ pat {info.ans printf("%s:\n", $1)info.ans printf("\t%d million people\n", $3)info.ans printf("\t%.3f million sq. mi.\n", $2/1000)info.ans printf("\t%.1f people per sq. mi.\n", 1000*$3/$2)info.ans }info.ans ' "$1" <countriesinfo1.ans awk 'info1.ans BEGIN { FS = "\t" }info1.ans $1 ~ pat {info1.ans printf("%s:\n", $1)info1.ans printf("\t%d million people\n", $3)info1.ans printf("\t%.3f million sq. mi.\n", $2/1000)info1.ans printf("\t%.1f people per sq. mi.\n", 1000*$3/$2)info1.ans }info1.ans ' pat="$1" <countriesletter.text Subject: Demographic Information About #1letter.text From: AWK Demographics, Inc.letter.text letter.text In response to your request for information about #1,letter.text our latest research has revealed that its population is #2letter.text million people and its area is #3 million square miles.letter.text This gives #1 a population density of #4 people perletter.text square mile.form.gen # form.gen - generate form lettersform.gen # input: prototype file letter.text; data linesform.gen # output: one form letter per data lineform.gen form.gen BEGIN {form.gen FS = ":"form.gen while (getline <"letter.text" > 0) # read form letterform.gen form[++n] = $0form.gen }form.gen form.gen { for (i = 1; i <= n; i++) { # read data linesform.gen temp = form[i] # each line generates a letterform.gen for (j = 1; j <= NF; j++)form.gen gsub("#" j, $j, temp)form.gen print tempform.gen }form.gen }capitals USSR Moscowcapitals Canada Ottawacapitals China Beijingcapitals USA Washingtoncapitals Brazil Brasiliacapitals India New Delhicapitals Mexico Mexico Citycapitals France Pariscapitals Japan Tokyocapitals Germany Bonncapitals England Londonmerge.awk awk ' BEGIN { FS = "\t" }merge.awk FILENAME == "capitals" {merge.awk cap[$1] = $2merge.awk }merge.awk FILENAME == "countries" && $4 == "Asia" {merge.awk print $1, $3, cap[$1]merge.awk }merge.awk ' capitals countriesjoin.awk # join - join file1 file2 on first fieldjoin.awk # input: two sorted files, tab-separated fieldsjoin.awk # output: natural join of lines with common first fieldjoin.awk join.awk BEGIN {join.awk OFS = sep = "\t"join.awk file2 = ARGV[2]join.awk ARGV[2] = "" # read file1 implicitly, file2 explicitlyjoin.awk eofstat = 1 # end of file status for file2join.awk if ((ng = getgroup()) <= 0)join.awk exit # file2 is emptyjoin.awk }join.awk join.awk { while (prefix($0) > prefix(gp[1]))join.awk if ((ng = getgroup()) <= 0)join.awk exit # file2 exhaustedjoin.awk if (prefix($0) == prefix(gp[1])) # 1st attributes in file1join.awk for (i = 1; i <= ng; i++) # and file2 matchjoin.awk print $0, suffix(gp[i]) # print joined linejoin.awk }join.awk join.awk function getgroup() { # put equal prefix group into gp[1..ng]join.awk if (getone(file2, gp, 1) <= 0) # end of filejoin.awk return 0join.awk for (ng = 2; getone(file2, gp, ng) > 0; ng++)join.awk if (prefix(gp[ng]) != prefix(gp[1])) {join.awk unget(gp[ng]) # went too farjoin.awk return ng-1join.awk }join.awk return ng-1join.awk }join.awk join.awk function getone(f, gp, n) { # get next line in gp[n]join.awk if (eofstat <= 0) # eof or error has occurredjoin.awk return 0join.awk if (ungot) { # return lookahead line if it existsjoin.awk gp[n] = ungotlinejoin.awk ungot = 0join.awk return 1join.awk }join.awk return eofstat = (getline gp[n] <f)join.awk }join.awk join.awk function unget(s) { ungotline = s; ungot = 1 }join.awk function prefix(s) { return substr(s, 1, index(s, sep) - 1) }join.awk function suffix(s) { return substr(s, index(s, sep) + 1) }relfile countries:relfile countryrelfile arearelfile populationrelfile continentrelfile capitals:relfile countryrelfile capitalrelfile cc:relfile countryrelfile arearelfile populationrelfile continentrelfile capitalrelfile !sort countries >temp.countriesrelfile !sort capitals >temp.capitalsrelfile !join temp.countries temp.capitals >ccavgarea.awk { area += $area }; END { print area/NR }qawk # qawk - awk relational database query processorqawk qawk BEGIN { readrel("relfile") }qawk /./ { doquery($0) }qawk qawk function readrel(f) {qawk while (getline <f > 0) # parse relfileqawk if ($0 ~ /^[A-Za-z]+ *:/) { # name:qawk gsub(/[^A-Za-z]+/, "", $0) # remove all but nameqawk relname[++nrel] = $0qawk } else if ($0 ~ /^[ \t]*!/) # !command...qawk cmd[nrel, ++ncmd[nrel]] = substr($0,index($0,"!")+1)qawk else if ($0 ~ /^[ \t]*[A-Za-z]+[ \t]*$/) # attributeqawk attr[nrel, $1] = ++nattr[nrel]qawk else if ($0 !~ /^[ \t]*$/) # not white spaceqawk print "bad line in relfile:", $0qawk }qawk function doquery(s, i,j) {qawk for (i in qattr) # clean up for next queryqawk delete qattr[i]qawk query = s # put $names in query into qattr, without $qawk while (match(s, /\$[A-Za-z]+/)) {qawk qattr[substr(s, RSTART+1, RLENGTH-1)] = 1qawk s = substr(s, RSTART+RLENGTH+1)qawk }qawk for (i = 1; i <= nrel && !subset(qattr, attr, i); ) qawk i++qawk if (i > nrel) # didn't find a table with all attributesqawk missing(qattr)qawk else { # table i contains attributes in queryqawk for (j in qattr) # create awk programqawk gsub("\\$" j, "$" attr[i,j], query)qawk for (j = 1; j <= ncmd[i]; j++) # create table iqawk if (system(cmd[i, j]) != 0) {qawk print "command failed, query skipped\n", cmd[i,j]qawk returnqawk }qawk awkcmd = sprintf("awk -F'\t' '%s' %s", query, relname[i])qawk printf("query: %s\n", awkcmd) # for debuggingqawk system(awkcmd)qawk }qawk }qawk function subset(q, a, r, i) { # is q a subset of a[r]?qawk for (i in q)qawk if (!((r,i) in a))qawk return 0qawk return 1qawk }qawk function missing(x, i) {qawk print "no table contains all of the following attributes:"qawk for (i in x)qawk print iqawk }qawk1.ans # qawk - awk relational database query processorqawk1.ans qawk1.ans BEGIN { readrel("relfile") }qawk1.ans /./ { doquery($0) }qawk1.ans qawk1.ans function readrel(f) {qawk1.ans while (getline <f > 0) # parse relfileqawk1.ans if ($0 ~ /^[A-Za-z]+ *:/) { # name:qawk1.ans gsub(/[^A-Za-z]+/, "", $0) # remove all but nameqawk1.ans relname[++nrel] = $0qawk1.ans } else if ($0 ~ /^[ \t]*!/) # !command...qawk1.ans cmd[nrel, ++ncmd[nrel]] = substr($0,index($0,"!")+1)qawk1.ans else if ($0 ~ /^[ \t]*[A-Za-z]+[ \t]*$/) # attributeqawk1.ans attr[nrel, $1] = ++nattr[nrel]qawk1.ans else if ($0 !~ /^[ \t]*$/) # not white spaceqawk1.ans print "bad line in relfile:", $0qawk1.ans }qawk1.ans function doquery(s, i,j,x) {qawk1.ans for (i in qattr) # clean up for next queryqawk1.ans delete qattr[i]qawk1.ans query = s # put $names in query into qattr, without $qawk1.ans while (match(s, /\$[A-Za-z]+/)) {qawk1.ans qattr[substr(s, RSTART+1, RLENGTH-1)] = 1qawk1.ans s = substr(s, RSTART+RLENGTH+1)qawk1.ans }qawk1.ans for (i = 1; i <= nrel && !subset(qattr, attr, i); ) qawk1.ans i++qawk1.ans if (i > nrel) # didn't find a table with all attributesqawk1.ans missing(qattr)qawk1.ans else { # table i contains attributes in queryqawk1.ans for (j in qattr) # create awk programqawk1.ans gsub("\\$" j, "$" attr[i,j], query)qawk1.ans if (!exists[i] && ncmd[i] > 0) {qawk1.ans for (j = 1; j <= ncmd[i]; j++)qawk1.ans x = x cmd[i, j] "\n"qawk1.ans print "executing\n" x # for debuggingqawk1.ans if (system(x) != 0) { # create table iqawk1.ans print "command failed, query skipped\n", xqawk1.ans returnqawk1.ans }qawk1.ans exists[i]++qawk1.ans }qawk1.ans awkcmd = sprintf("awk -F'\t' '%s' %s", query, relname[i])qawk1.ans printf("query: %s\n", awkcmd) # for debuggingqawk1.ans system(awkcmd)qawk1.ans }qawk1.ans }qawk1.ans function subset(q, a, r, i) { # is q a subset of a[r]?qawk1.ans for (i in q)qawk1.ans if (!((r,i) in a))qawk1.ans return 0qawk1.ans return 1qawk1.ans }qawk1.ans function missing(x, i) {qawk1.ans print "no table contains all of the following attributes:"qawk1.ans for (i in x)qawk1.ans print iqawk1.ans }randint # randint - return random integer x, 1 <= x <= nrandint randint function randint(n) {randint return int(n * rand()) + 1randint }randlet # randlet - generate random lower-case letterrandlet randlet function randlet() {randlet return substr("abcdefghijklmnopqrstuvwxyz", randint(26), 1)randlet }choose # choose - print in order k random elements from A[1]..A[n]choose choose function choose(A, k, n, i) {choose for (i = 1; n > 0; i++)choose if (rand() < k/n--) {choose print A[i]choose k--choose }choose }comb.ans # print k distinct random integers between 1 and ncomb.ans comb.ans { random($1, $2) }comb.ans comb.ans function random(k, n, A, i, r) {comb.ans for (i = n-k+1; i <= n; i++)comb.ans ((r = randint(i)) in A) ? A[i] : A[r]comb.ans for (i in A)comb.ans print icomb.ans }comb.ans comb.ans function randint(n) { return int(n*rand())+1 }bridge.ans # bridge - generate random bridge handsbridge.ans bridge.ans BEGIN { split(permute(52,52), deck) # generate a random deckbridge.ans sort(1,13); sort(14,26); sort(27,39); sort(40,52) # sort handsbridge.ans prhands() # format and print the four handsbridge.ans }bridge.ans bridge.ans function permute(k, n, i, p, r) { # generate a random permutationbridge.ans srand(); p = " " # of k integers between 1 and nbridge.ans for (i = n-k+1; i <= n; i++)bridge.ans if (p ~ " " (r = int(i*rand())+1) " " )bridge.ans sub(" " r " ", " " r " " i " ", p) # put i after r in pbridge.ans else p = " " r p # put r at beginning of pbridge.ans return pbridge.ans }bridge.ans bridge.ans function sort(left,right, i,j,t) { # sort hand in deck[left..right]bridge.ans for (i = left+1; i <= right; i++)bridge.ans for (j = i; j > left && deck[j-1] < deck[j]; j--) {bridge.ans t = deck[j-1]; deck[j-1] = deck[j]; deck[j] = tbridge.ans }bridge.ans }bridge.ans bridge.ans function prhands() { # print the four handsbridge.ans b = sprintf("%20s", " "); b40 = sprintf("%40s", " ")bridge.ans card = 1 # global index into deckbridge.ans suits(13); print b " NORTH"bridge.ans print b spds; print b hrts; print b dnds; print b clbsbridge.ans suits(26) # create the west hand from deck[14..26]bridge.ans ws = spds substr(b40, 1, 40 - length(spds))bridge.ans wh = hrts substr(b40, 1, 40 - length(hrts))bridge.ans wd = dnds substr(b40, 1, 40 - length(dnds))bridge.ans wc = clbs substr(b40, 1, 40 - length(clbs))bridge.ans suits(39); print " WEST" sprintf("%36s", " ") "EAST"bridge.ans print ws spds; print wh hrts; print wd dnds; print wc clbsbridge.ans suits(52); print b " SOUTH"bridge.ans print b spds; print b hrts; print b dnds; print b clbsbridge.ans }bridge.ans bridge.ans function suits(j) { # collect suits of hand in deck[j-12..j]bridge.ans for (spds = "S:"; deck[card] > 39 && card <= j; card++)bridge.ans spds = spds " " fvcard(deck[card])bridge.ans for (hrts = "H:"; deck[card] > 26 && card <= j; card++)bridge.ans hrts = hrts " " fvcard(deck[card])bridge.ans for (dnds = "D:"; deck[card] > 13 && card <= j; card++)bridge.ans dnds = dnds " " fvcard(deck[card])bridge.ans for (clbs = "C:"; card <= j; card++)bridge.ans clbs = clbs " " fvcard(deck[card])bridge.ans }bridge.ans bridge.ans function fvcard(i) { # compute face value of card ibridge.ans if (i % 13 == 0) return "A"bridge.ans else if (i % 13 == 12) return "K"bridge.ans else if (i % 13 == 11) return "Q"bridge.ans else if (i % 13 == 10) return "J"bridge.ans else return (i % 13) + 1bridge.ans }cliche # cliche - generate an endless stream of clichescliche # input: lines of form subject:predicatecliche # output: lines of random subject and random predicatecliche cliche BEGIN { FS = ":" }cliche { x[NR] = $1; y[NR] = $2 }cliche END { for (;;) print x[randint(NR)], y[randint(NR)] }cliche cliche function randint(n) { return int(n * rand()) + 1 }grammar Sentence -> Nounphrase Verbphrasegrammar Nounphrase -> the boygrammar Nounphrase -> the girlgrammar Verbphrase -> Verb Modlist Adverbgrammar Verb -> runsgrammar Verb -> walksgrammar Modlist ->grammar Modlist -> very Modlistgrammar Adverb -> quicklygrammar Adverb -> slowlysentgen # sentgen - random sentence generatorsentgen # input: grammar file; sequence of nonterminalssentgen # output: a random sentence for each nonterminalsentgen sentgen BEGIN { # read rules from grammar filesentgen while (getline < "grammar" > 0)sentgen if ($2 == "->") {sentgen i = ++lhs[$1] # count lhssentgen rhscnt[$1, i] = NF-2 # how many in rhssentgen for (j = 3; j <= NF; j++) # record themsentgen rhslist[$1, i, j-2] = $jsentgen } elsesentgen print "illegal production: " $0sentgen }sentgen sentgen { if ($1 in lhs) { # nonterminal to expandsentgen gen($1)sentgen printf("\n")sentgen } else sentgen print "unknown nonterminal: " $0 sentgen }sentgen
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -