Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
####### # # E-scripts on awk. # # Note 1: use the eev command (defined in eev.el) and the # ee alias (in my .zshrc) to execute parts of this file. # Executing this file as a whole makes no sense. # An introduction to eev can be found here: # # (find-eev-quick-intro) # http://angg.twu.net/eev-intros/find-eev-quick-intro.html # # Note 2: be VERY careful and make sure you understand what # you're doing. # # Note 3: If you use a shell other than zsh things like |& # and the for loops may not work. # # Note 4: I always run as root. # # Note 5: some parts are too old and don't work anymore. Some # never worked. # # Note 6: the definitions for the find-xxxfile commands are on my # .emacs. # # Note 7: if you see a strange command check my .zshrc -- it may # be defined there as a function or an alias. # # Note 8: the sections without dates are always older than the # sections with dates. # # This file is at <http://angg.twu.net/e/awk.e> # or at <http://angg.twu.net/e/awk.e.html>. # See also <http://angg.twu.net/emacs.html>, # <http://angg.twu.net/.emacs[.html]>, # <http://angg.twu.net/.zshrc[.html]>, # <http://angg.twu.net/escripts.html>, # and <http://angg.twu.net/>. # ####### # «.changer.awk» (to "changer.awk") # «.ARGV» (to "ARGV") # «.ARGC» (to "ARGC") # «.NR-and-NF» (to "NR-and-NF") # «.printf» (to "printf") # «.figlet» (to "figlet") # «.getline» (to "getline") # «.gawk-docs» (to "gawk-docs") # «.awkbookcode» (to "awkbookcode") # «.recursive-descent» (to "recursive-descent") # «.getting-started» (to "getting-started") # «.sub» (to "sub") # «.between» (to "between") # «.txr» (to "txr") # (find-status "gawk-doc") # (find-vldifile "gawk-doc.list") # (find-udfile "gawk-doc/") # (find-status "gawk") # (find-vldifile "gawk.list") # (find-fline "/usr/doc/gawk/") # (find-fline "/usr/share/awk/") # (find-fline "/usr/doc/gawk/examples/data/") # (find-fline "/usr/doc/gawk/examples/misc/") # (find-fline "/usr/doc/gawk/examples/network/") # (find-fline "/usr/doc/gawk/examples/prog/") # (find-fline "/usr/bin/igawk") # (find-man "1 gawk") # (find-man "1 gawk" "Built-in Variables") # (find-man "1 gawk" "I/O Statements") # (find-man "1 gawk" "String Functions") # (find-node "(gawk)Top") # (find-node "(gawkinet)Top") # (find-node "(gawk)Getline/Variable") # (find-status "mawk") # (find-vldifile "mawk.list") # (find-fline "/usr/doc/mawk/") # (find-fline "/usr/doc/mawk/examples/") # (find-fline "/usr/doc/mawk/examples/deps.awk.gz") # (find-man "1 mawk") #* rm -Rv ~/tmp/awktest/ mkdir ~/tmp/awktest/ cd ~/tmp/awktest/ cat > file1 <<'---' aaa @beg bbb ccc @end ddd --- cat > file2 <<'---' xxxx yyyy --- #* # (find-node "(gawk)Running gawk") # (find-node "(gawk)Action Overview") cd ~/tmp/awktest/ awk ' /@beg/ { print "BEG!" } /@end/ { print "END!" } // ' file1 awk ' /@beg/ { print "BEG!" } /@end/ { print "END!" } { print } ' file1 # (find-node "(gawk)Next Statement") awk ' /@beg/ { print "BEG!"; next } /@end/ { print "END!"; next } { print } ' file1 #* cd ~/tmp/awktest/ awk ' /@beg/ { print "BEG!"; omit = 1; next } /@end/ { print "END!"; omit = 0; next } ! omit { print } ' file1 #* # (find-node "(gawk)Getline/Variable/File") # (find-node "(gawk)Options" "`--posix'") # (find-node "(gawk)Options" "`--traditional'") cd ~/tmp/awktest/ awk ' /@beg/ { print "BEG!"; omit = 1; while (getline line < "file2") print line; next } /@end/ { print "END!"; omit = 0; next } ! omit { print } ' file1 #* ##### # # changer.awk # 2002may04 # ##### # «changer.awk» (to ".changer.awk") #* rm -Rv ~/tmp/awktest/ mkdir ~/tmp/awktest/ cd ~/tmp/awktest/ cp -v ~/eev/changer.awk . # (find-eev "changer.awk") # (find-eev "rcfiles/.bashrc") cat > .bashrc <<'---' aaa @beg bbb ccc @end ddd --- awk -v eevblock=$HOME/eev/rcfiles/.bashrc \ -f changer.awk \ .bashrc cat > .bashrc <<'---' aaa # Beginning of the eev block: blablabla. # End of the eev block. ddd --- awk -v eevblock=$HOME/eev/rcfiles/.bashrc \ -f changer.awk \ .bashrc #* # (find-node "(gawk)Index") #* rm -Rv ~/tmp/awktest/ mkdir ~/tmp/awktest/ cd ~/tmp/awktest/ cp -v ~/.bashrc ~/.emacs ~/.zshrc ~/.gdbinit . # (find-eev "changer.sh") # (find-eev "changer.awk") cd ~/eev/ # ./changer.sh rcfiles/.bashrc \ # ~/tmp/awktest/.bashrc ~/tmp/awktest/.bashrc_pre-eev # ./changer.sh rcfiles/.bashrc \ # ~/tmp/awktest/.bashrc ~/tmp/awktest/.bashrc_pre-eev ./changer.sh rcfiles/.emacs ~/tmp/awktest/.emacs ./changer.sh rcfiles/.bashrc ~/tmp/awktest/.bashrc ./changer.sh rcfiles/.zshrc ~/tmp/awktest/.zshrc ./changer.sh rcfiles/.gdbinit ~/tmp/awktest/.gdbinit ./changer.sh rcfiles/.cshrc ~/tmp/awktest/.cshrc # ~/tmp/awktest/.gdbinit_pre-eev cd ~/tmp/awktest/ #* # (find-fline "~/tmp/awktest/") #### # # argv # 2004mar18 # #### # «ARGV» (to ".ARGV") # «ARGC» (to ".ARGC") # (find-gawknode "") # (find-gawknode "Auto-set" "`ARGC, ARGV'") # (find-gawknode "Auto-set" "ENVIRON") # (find-gawknode "Other Arguments") # (find-gawknode "Auto-set" "`ARGIND #'") #* awk 'BEGIN { for (i=0; i<ARGC; i++) print i, ARGV[i] }' arg1 arg2 #* unset FOO; gawk 'BEGIN { print ENVIRON["FOO"] }' FOO=bar gawk 'BEGIN { print ENVIRON["FOO"] }' FOO="baz baz" gawk 'BEGIN { print ENVIRON["FOO"] }' #* rm -Rv /tmp/awk/ mkdir /tmp/awk/ cd /tmp/awk/ echo FOO > foo echo BAR > bar awk ' BEGIN { for(i=0;i<ARGC;i++) print i,ARGV[i] } { print } ' foo bar echo input from stdin | \ awk ' BEGIN { for(i=0;i<ARGC;i++) print i,ARGV[i]; ARGC=1 } { print } ' foo bar #* ##### # # NR-and-NF # 2021oct12 # ##### # «NR-and-NF» (to ".NR-and-NF") # (find-gawknode "Auto-set" "'NR'" "number of input records 'awk' has processed") # (find-gawknode "Auto-set" "'NF'" "The number of fields in the current") * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) ghc --version ghc --version | awk '{print NF}' ghc --version | awk '{print $NF}' echo a/bb/ccc/ddd | awk -F/ '{print $NF}' echo a/bb/ccc/ddd | tr / '\n' echo a/bb/ccc/ddd | tr / '\n' | awk 'NR==3' ##### # # printf # 2021oct12 # ##### # «printf» (to ".printf") # (find-gawknode "Basic Printf") ##### # # figlet # 2021dec17 # ##### # «figlet» (to ".figlet") * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) echo 'Foo bar' | figlet -f standard | awk '{printf "-- %s\n", $0}' ##### # # getline # 2004oct13 # ##### # «getline» (to ".getline") # (find-node "(gawk)Plain Getline") # (find-node "(gawk)Getline/Variable/File") #* rm -Rv /tmp/awk/ mkdir /tmp/awk/ cd /tmp/awk/ cat > myfile <<'%%%' one two two four four four four %%% awk 'BEGIN { do { a = (getline line < "myfile") print a, line } while (a) }' awk 'BEGIN { while (getline line < "myfile") print line print "last line:", line }' rm myfile awk 'BEGIN { getline first_line < "myfile" while (getline last_line < "myfile") {} print "first line:", first_line print "last line: ", last_line }' #* ##### # # gawk docs (on etch) # 2007may18 # ##### # «gawk-docs» (to ".gawk-docs") # http://www.gnu.org/ # http://www.gnu.org/software/gawk/gawk.html # http://ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.bz2 #* rm -Rv ~/usrc/gawk-3.1.5/ tar -C ~/usrc/ -xvjf \ $S/http/ftp.gnu.org/gnu/gawk/gawk-3.1.5.tar.bz2 cd ~/usrc/gawk-3.1.5/ #* # (code-c-d "gawk" "~/usrc/gawk-3.1.5/" "~/usrc/gawk-3.1.5/doc/gawk") # (find-gawkfile "") # (find-gawknode "Top") # (find-gawknode "Nondecimal-numbers") # (find-man "bc") # (find-man "dc") # (find-node "(libc)Parsing of Integers") # (find-node "(libc)Line Input") ##### # # Recursive descent parser # 2011nov01 # ##### # «awkbookcode» (to ".awkbookcode") # «recursive-descent» (to ".recursive-descent") # (find-books "__comp/__comp.el" "awk") # http://www.netlib.org/research/awkbookcode/ # http://www.netlib.org/research/awkbookcode/ch1 # http://www.netlib.org/research/awkbookcode/ch2 # http://www.netlib.org/research/awkbookcode/ch3 # http://www.netlib.org/research/awkbookcode/ch4 # http://www.netlib.org/research/awkbookcode/ch5 # http://www.netlib.org/research/awkbookcode/ch6 # http://www.netlib.org/research/awkbookcode/ch7 # http://www.netlib.org/research/awkbookcode/unbundle.awk * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) rm -Rv /tmp/awkbookcode/ mkdir /tmp/awkbookcode/ cd /tmp/awkbookcode/ cat $S/http/www.netlib.org/research/awkbookcode/ch6 \ | awk -f $S/http/www.netlib.org/research/awkbookcode/unbundle.awk # (find-fline "/tmp/awkbookcode/") # (find-fline "/tmp/awkbookcode/awk.parser") ##### # # The examples in the "Getting started" section of the manual # 2019oct03 # ##### # «getting-started» (to ".getting-started") # (find-node "(gawk)Getting Started") # (find-node "(gawk)Very Simple" "NF > 0") # (find-node "(gawk)Two Rules") # (find-node "(gawk)More Complex") # (find-node "(gawk)Regexp") # (find-gawknode "String Functions" "gsub(REGEXP") # (find-gawknode "Bracket Expressions") ##### # # sub # 2023may08 # ##### # «sub» (to ".sub") # (find-gawknode "String Functions" "'sub(REGEXP") # https://unix.stackexchange.com/questions/134212/extract-file-name-from-path-in-awk-program # https://documentacoes.wordpress.com/2019/01/17/basename-and-dirname-commands-implemented-in-awk/ # https://groups.google.com/g/comp.lang.awk/c/eyqbS7ojRuQ * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) awk ' function basename(file) { sub(".*/", "", file) return file } {print FILENAME, basename(FILENAME)} ' /path/to/file awk ' function basename(file, a, n) { n = split(file, a, "/") return a[n] } {print FILENAME, basename(FILENAME)} ' /path/to/file ##### # # print everything between certain delimiter lines # 2024apr28 # ##### # «between» (to ".between") # (find-es "pygments" "fancyvrb") * (eepitch-shell) * (eepitch-kill) * (eepitch-shell) seq 1 20 | gawk ' $1 == "4" { out = 1 } out == 1 { print } $1 == "8" { out = 0 } ' ##### # # txr # 2021feb04 # ##### # «txr» (to ".txr") # https://nongnu.org/txr/ # https://nongnu.org/txr/rosetta-solutions.html # https://nongnu.org/txr/txr-pattern-language.html http://www.cs.nott.ac.uk/~txa/g51mal/notes-6x.pdf http://www.wra1th.plus.com/awk/awkfri.txt http://www.mailsend-online.com/blog/along-came-awk.html http://books.cat-v.org/computer-science/awk-programming-language/The_AWK_Programming_Language.pdf https://jherrlin.github.io/posts/learn-awk/ https://news.ycombinator.com/item?id=13451454 The Awk Programming Language (1988) [pdf] (archive.org) https://news.ycombinator.com/item?id=29528439 Cheating at a company group activity using Unix tools (medium.com/fundbox-engineering) https://news.ycombinator.com/item?id=32569477 Unix legend, who owes us nothing, keeps fixing foundational Awk code (arstechnica.com) https://news.ycombinator.com/item?id=32969238 What does $0=$2 in awk do? (kau.sh) - learning resources https://maximullaris.com/goawk_cover.html https://news.ycombinator.com/item?id=34393085 Awk: Power and Promise of a 40 yr old language (2021) (fosslife.org) https://github.com/TheMozg/awk-raycaster https://news.ycombinator.com/item?id=34438560 The State of the Awk (2020) (lwn.net) https://news.ycombinator.com/item?id=34442528 A first person shooter in 571 lines of GNU Awk (2016) (github.com/themozg) *** https://github.com/geary/awk/blob/master/LJPII.AWK https://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk https://news.ycombinator.com/item?id=34280281 Learn to Process Text in Linux Using Grep, Sed, and Awk (linode.com) https://news.ycombinator.com/item?id=33936366 Haskell, Ada, C++, Awk: An Experiment in Prototyping Productivity (1994) [pdf] (yale.edu) https://news.ycombinator.com/item?id=32534173 Brian Kernighan adds Unicode support to Awk (github.com/onetrueawk) - groff / troff https://irreal.org/blog/?p=10746 Brailsford & Kernighan on AWK https://c2.com/doc/expense/ Expense Calculator - Ward Cunningham - awk https://maximullaris.com/awk.html A fascination of Awk https://maximullaris.com/awk_tech_notes.html https://news.ycombinator.com/item?id=35339955 Awk Technical Notes (maximullaris.com) https://maximullaris.com/bytebeat_gawk.html https://news.ycombinator.com/item?id=36389755 Fhtagn – A tiny CLI programs tester written in Awk (maximullaris.com) https://awk.dev/ https://news.ycombinator.com/item?id=37290356 CLI text processing with GNU awk (learnbyexample.github.io) https://benhoyt.com/writings/awk-make/ https://backreference.org/2010/02/10/idiomatic-awk/ # Local Variables: # coding: utf-8-unix # End: