⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 awkcode.txt

📁 c programming pearls answer
💻 TXT
📖 第 1 页 / 共 5 页
字号:
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 + -