📄 awkcode.txt
字号:
ny2.awk /New York/smith.awk BEGIN { RS = ""; FS = "\n" }smith.awk $1 ~ /Smith$/ { print $1, $4 } # name, phonemsort.sh # pipeline to sort address list by last namesmsort.sh msort.sh awk 'msort.sh BEGIN { RS = ""; FS = "\n" }msort.sh { printf("%s!!#", x[split($1, x, " ")])msort.sh for (i = 1; i <= NF; i++)msort.sh printf("%s%s", $i, i < NF ? "!!#" : "\n")msort.sh }msort.sh ' |msort.sh sort |msort.sh awk 'msort.sh BEGIN { FS = "!!#" }msort.sh { for (i = 2; i <= NF; i++)msort.sh printf("%s\n", $i)msort.sh printf("\n")msort.sh }msort.sh 'addr.2 accountantaddr.2 Adam Smithaddr.2 1234 Wall St., Apt. 5Caddr.2 New York, NY 10021addr.2 addr.2 doctor - ophthalmologistaddr.2 Dr. Will Seymouraddr.2 798 Maple Blvd.addr.2 Berkeley Heights, NJ 07922addr.2 addr.2 lawyeraddr.2 David W. Copperfieldaddr.2 221 Dickens Laneaddr.2 Monterey, CA 93940addr.2 addr.2 doctor - pediatricianaddr.2 Dr. Susan Markaddr.2 600 Mountain Avenueaddr.2 Murray Hill, NJ 07974doctors1.awk /^doctor/, /^$/doctors2.awk /^doctor/ { p = 1; next }doctors2.awk p == 1doctors2.awk /^$/ { p = 0; next }checks.data check 1021checks.data to Champagne Unlimitedchecks.data amount 123.10checks.data date 1/1/87checks.data checks.data depositchecks.data amount 500.00checks.data date 1/1/87checks.data checks.data check 1022checks.data date 1/2/87checks.data amount 45.10checks.data to Getwell Drug Storechecks.data tax medicalchecks.data checks.data check 1023checks.data amount 125.00checks.data to International Travelchecks.data date 1/3/87checks.data checks.data amount 50.00checks.data to Carnegie Hallchecks.data date 1/3/87checks.data check 1024checks.data tax charitable contributionchecks.data checks.data to American Expresschecks.data check 1025checks.data amount 75.75checks.data date 1/5/87check1 # check1 - print total deposits and checkscheck1 check1 /^check/ { ck = 1; next }check1 /^deposit/ { dep = 1; next }check1 /^amount/ { amt = $2; next }check1 /^$/ { addup() }check1 check1 END { addup()check1 printf("deposits $%.2f, checks $%.2f\n",check1 deposits, checks)check1 }check1 check1 function addup() {check1 if (ck)check1 checks += amtcheck1 else if (dep)check1 deposits += amtcheck1 ck = dep = amt = 0check1 }check2 # check2 - print total deposits and checkscheck2 check2 BEGIN { RS = ""; FS = "\n" }check2 /(^|\n)deposit/ { deposits += field("amount"); next }check2 /(^|\n)check/ { checks += field("amount"); next }check2 END { printf("deposits $%.2f, checks $%.2f\n",check2 deposits, checks)check2 }check2 check2 function field(name, i,f) {check2 for (i = 1; i <= NF; i++) {check2 split($i, f, "\t")check2 if (f[1] == name)check2 return f[2]check2 }check2 printf("error: no field %s in record\n%s\n", name, $0)check2 }check3 # check3 - print check informationcheck3 check3 BEGIN { RS = ""; FS = "\n" }check3 /(^|\n)check/ {check3 for (i = 1; i <= NF; i++) {check3 split($i, f, "\t")check3 val[f[1]] = f[2]check3 }check3 printf("%8s %5d %8s %s\n",check3 val["date"],check3 val["check"],check3 sprintf("$%.2f", val["amount"]),check3 val["to"])check3 for (i in val)check3 delete val[i]check3 }prep1 # prep1 - prepare countries by continent and pop. den.prep1 prep1 BEGIN { FS = "\t" }prep1 { printf("%s:%s:%d:%d:%.1f\n",prep1 $4, $1, $3, $2, 1000*$3/$2) | "sort -t: +0 -1 +4rn"prep1 }form1 # form1 - format countries data by continent, pop. den.form1 form1 BEGIN { FS = ":"form1 printf("%-15s %-10s %10s %7s %12s\n",form1 "CONTINENT", "COUNTRY", "POPULATION",form1 "AREA", "POP. DEN.")form1 }form1 { printf("%-15s %-10s %7d %10d %10.1f\n",form1 $1, $2, $3, $4, $5)form1 }prep2 # prep2 - prepare countries by continent, inverse pop. den.prep2 prep2 BEGIN { FS = "\t"}prep2 { den = 1000*$3/$2prep2 printf("%-15s:%12.8f:%s:%d:%d:%.1f\n",prep2 $4, 1/den, $1, $3, $2, den) | "sort"prep2 }form2 # form2 - format countries by continent, pop. den.form2 form2 BEGIN { FS = ":"form2 printf("%-15s %-10s %10s %7s %12s\n",form2 "CONTINENT", "COUNTRY", "POPULATION",form2 "AREA", "POP. DEN.")form2 }form2 { if ($1 != prev) {form2 print ""form2 prev = $1form2 } elseform2 $1 = ""form2 printf("%-15s %-10s %7d %10d %10.1f\n",form2 $1, $2, $3, $4, $5)form2 }prep3 # prep3 - prepare countries data for form3prep3 prep3 BEGIN { FS = "\t" }prep3 pass == 1 {prep3 area[$4] += $2prep3 areatot += $2prep3 pop[$4] += $3prep3 poptot += $3prep3 }prep3 pass == 2 {prep3 den = 1000*$3/$2prep3 printf("%s:%s:%s:%f:%d:%f:%f:%d:%d\n",prep3 $4, $1, $3, 100*$3/poptot, $2, 100*$2/areatot,prep3 den, pop[$4], area[$4]) | "sort -t: +0 -1 +6rn"prep3 }form3 # form3 - format countries report number 3form3 form3 BEGIN {form3 FS = ":"; date = "January 1, 1988"form3 hfmt = "%36s %8s %12s %7s %12s\n"form3 tfmt = "%33s %10s %10s %9s\n"form3 TOTfmt = " TOTAL for %-13s%7d%11.1f%11d%10.1f\n" form3 printf("%-18s %-40s %19s\n\n", "Report No. 3",form3 "POPULATION, AREA, POPULATION DENSITY", date)form3 printf(" %-14s %-14s %-23s %-14s %-11s\n\n",form3 "CONTINENT", "COUNTRY", "POPULATION", "AREA", "POP. DEN.")form3 printf(hfmt, "Millions ", "Pct. of", "Thousands ",form3 "Pct. of", "People per")form3 printf(hfmt, "of People", "Total ", "of Sq. Mi.",form3 "Total ", "Sq. Mi. ")form3 printf(hfmt, "---------", "-------", "----------",form3 "-------", "----------")form3 }form3 { if ($1 != prev) { # new continentform3 if (NR > 1)form3 totalprint()form3 prev = $1 # first entry for continentform3 poptot = $8; poppct = $4form3 areatot = $9; areapct = $6form3 } else { # next entry for continentform3 $1 = ""form3 poppct += $4; areapct += $6form3 }form3 printf(" %-15s%-10s %6d %10.1f %10d %9.1f %10.1f\n",form3 $1, $2, $3, $4, $5, $6, $7)form3 gpop += $3; gpoppct += $4form3 garea += $5; gareapct += $6form3 }form3 form3 END {form3 totalprint()form3 printf(" GRAND TOTAL %20d %10.1f %10d %9.1f\n",form3 gpop, gpoppct, garea, gareapct)form3 printf(tfmt, "=====", "======", "=====", "======")form3 }form3 form3 function totalprint() { # print totals for previous continentform3 printf(tfmt, "----", "-----", "-----", "-----")form3 printf(TOTfmt, prev, poptot, poppct, areatot, areapct)form3 printf(tfmt, "====", "=====", "=====", "=====")form3 }form4 # form4 - format countries data for tbl inputform4 form4 BEGIN {form4 FS = ":"; OFS = "\t"; date = "January 1, 1988"form4 print ".TS\ncenter;"form4 print "l c s s s r s\nl\nl l c s c s c\nl l c c c c c."form4 printf("%s\t%s\t%s\n\n", "Report No. 3",form4 "POPULATION, AREA, POPULATION DENSITY", date)form4 print "CONTINENT", "COUNTRY", "POPULATION",form4 "AREA", "POP. DEN."form4 print "", "", "Millions", "Pct. of", "Thousands",form4 "Pct. of", "People per"form4 print "", "", "of People", "Total", "of Sq. Mi.",form4 "Total", "Sq. Mi."form4 print "\t\t_\t_\t_\t_\t_"form4 print ".T&\nl l n n n n n."form4 }form4 form4 { if ($1 != prev) { # new continentform4 if (NR > 1)form4 totalprint()form4 prev = $1form4 poptot = $8; poppct = $4form4 areatot = $9; areapct = $6form4 } else { # next entry for current continentform4 $1 = ""form4 poppct += $4; areapct += $6form4 }form4 printf("%s\t%s\t%d\t%.1f\t%d\t%.1f\t%.1f\n",form4 $1, $2, $3, $4, $5, $6, $7)form4 gpop += $3; gpoppct += $4form4 garea += $5; gareapct += $6form4 }form4 form4 END {form4 totalprint()form4 print ".T&\nl s n n n n n."form4 printf("GRAND TOTAL\t%d\t%.1f\t%d\t%.1f\n",form4 gpop, gpoppct, garea, gareapct)form4 print "", "=", "=", "=", "=", "="form4 print ".TE"form4 }form4 form4 function totalprint() { # print totals for previous continentform4 print ".T&\nl s n n n n n."form4 print "", "_", "_", "_", "_", "_"form4 printf(" TOTAL for %s\t%d\t%.1f\t%d\t%.1f\n",form4 prev, poptot, poppct, areatot, areapct)form4 print "", "=", "=", "=", "=", "="form4 print ".T&\nl l n n n n n."form4 }table # table - simple table formattertable table BEGIN {table FS = "\t"; blanks = sprintf("%100s", " ")table number = "^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$"table }table table { row[NR] = $0table for (i = 1; i <= NF; i++) {table if ($i ~ number)table nwid[i] = max(nwid[i], length($i))table wid[i] = max(wid[i], length($i))table }table }table table END {table for (r = 1; r <= NR; r++) {table n = split(row[r], d)table for (i = 1; i <= n; i++) {table sep = (i < n) ? " " : "\n"table if (d[i] ~ number)table printf("%" wid[i] "s%s", numjust(i,d[i]), sep)table elsetable printf("%-" wid[i] "s%s", d[i], sep)table }table }table }table table function max(x, y) { return (x > y) ? x : y }table table function numjust(n, s) { # position s in field ntable return s substr(blanks, 1, int((wid[n]-nwid[n])/2))table }table1 # table1 - single column formattertable1 # input: one column of strings and decimal numberstable1 # output: aligned columntable1 table1 BEGIN {table1 blanks = sprintf("%100s", " ")table1 number = "^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)$"table1 left = "^[+-]?[0-9]*"table1 right = "[.][0-9]*"table1 }table1 table1 { row[NR] = $1table1 if ($1 ~ number) {table1 match($1, left) # matches the empty string, so RLENGTH>=0table1 lwid = max(lwid, RLENGTH)table1 if (!match($1, right))table1 RLENGTH = 0table1 rwid = max(rwid, RLENGTH)table1 wid = max(wid, lwid + rwid)table1 } elsetable1 wid = max(wid, length($1))table1 }table1 table1 END {table1 for (r = 1; r <= NR; r++) {table1 if (row[r] ~ number)table1 printf("%" wid "s\n", numjust(row[r]))table1 elsetable1 printf("%-" wid "s\n", row[r])table1 }table1 }table1 table1 function max(x, y) { return (x > y) ? x : y }table1 table1 function numjust(s) { # position stable1 if (!match(s, right))table1 RLENGTH = 0table1 return s substr(blanks, 1, int(rwid-RLENGTH+(wid-(lwid+rwid))/2))table1 }info0 awk 'info0 BEGIN { FS = "\t" }info0 $1 ~ /Canada/ {info0 printf("%s:\n", $1)info0 printf("\t%d million people\n", $3)info0 printf("\t%.3f million sq. mi.\n", $2/1000)info0 printf("\t%.1f people per sq. mi.\n", 1000*$3/$2)info0 }info0 ' countriesinfo awk 'info # info - print information about countryinfo # usage: info country-nameinfo info BEGIN { FS = "\t" }info $1 ~ /'$1'/ {info printf("%s:\n", $1)info printf("\t%d million people\n", $3)info printf("\t%.3f million sq. mi.\n", $2/1000)info printf("\t%.1f people per sq. mi.\n", 1000*$3/$2)info }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -