#!/bin/bash
######### 1.1 pattern action => if pattern then action
######### 1.2 What is True/False in awk?
######### 0 or "" is False
echo "1 foo" | awk '4'
1 foo
######### 1.3 Comparison, matching
echo "2 foo" | awk '{print $0 == "foo"}'
echo "3 foo" | awk '{print 0""}'
echo "4 foo" | awk '0""'
echo "5 foo" | awk '0{} END{print "END"}'
######### $0 ~ and {print $0} can be omitted
echo "6 foo" | awk '/foo/' ### 6 foo
echo "7 foo" | awk '$0 ~ /foo/' ### 7 foo
echo "8 foo" | awk '$1 = "bar"' ### bar foo
echo "9 foo bar" | awk '$1 = "bar" {print}'
echo "10 a b c" | awk '($2 = ""){} END{print "END"}'
echo "11 a b c" | awk '!($2 = "")'
######### 1.5 variables
echo "12 a b c" | awk 'NF == 4'
echo "13 a b c d" | awk 'NF = 2' ##### 13 a
echo "echo -e '"'14 a\n b\n \n\n\n\n c\n d\n'"' | awk 'NF' #### delete empty line"
echo -e "14 a\n b\n \n\n\n\n c\n d\n" | awk 'NF' #### delete empty line
######### 1.6 functions
######## gsub => sed 's/A/B/g'
echo "15 ab cd ef gh" | awk '$0 = gsub(/ab/, "") {print "contained"} '
echo "16 ab cd ef gh" | awk '! ($0 = gsub(/ac/, "")) {print "not contained"}'
echo "17 ab cd ef gh" | awk '$0 = gsub(/ac/, "") ""' #### print "0"
echo "17 ab cd ef gh" | awk 'split($0, array) {print array[1], array[4]}'
######### 2 Record
######### 2.1 row = record
######### RS: Record Separator
######### 2.2 NR: Number of Record
echo "seq 1 10 | awk 'NR>5'"
seq 1 10 | awk 'NR>5'
echo "seq 1 100 | tac | awk 'NR<=5' |tac"
seq 1 100 | tac | awk 'NR<=5' |tac
######### 2.5 Range like sed
echo "echo seq 1 100 | awk 'NR==10, NR==15'"
seq 1 100 | awk 'NR==10, NR==15'
echo "seq 1 100 | sed -e '1,9d' -e '16,\$d'"
seq 1 100 | sed -e '1,9d' -e '15,$d'
######### 2.7 grep
echo "seq 1 10 | awk '/[23]/'"
seq 1 10 | awk '/[23]/'
seq 1 10 | awk '$0 ~ /[23]/'
######### 2.8 grep -v
echo "seq 1 10 | awk '!/[3-8]/'"
seq 1 10 | awk '!/[3-8]/'
seq 1 10 | awk '$0 !~/[3-8]/'
######### 2.9 getline
seq 1 10 | awk 'BEGIN{
while (getline < "-" >0){
print $0, "NR = ", NR;
}
# close("-");
} '
######### 3.1 Fields, only variable FS can be passed directly like -F
######### other variables are passed via -v var=$VAR
echo "a, b, c" | awk -F',' '{print $2}'
VAR="awk"; echo "a, b, c" | awk -v var=$VAR '{print var, $2 }'
######### 3.3 FS can use regular expression
date | awk -F'[ :/]' '{print $0,"(->$2, $3)",$2, $3}'
echo "a b c" | awk '!($2 = "")' # awk '{$2 = ""; print}'
######### 3.4
# , is OFS (Output Field Separator)
# string can be concatenated with a spacen
echo "a b c" | awk '{i = 2; while(i <= NF){a = a OFS $(i++); print a}}'
######## 3.6 reconstruction of fields
echo "a,b,c" |awk -F',' -v OFS=':' '4'
echo "a,b,c" |awk -F',' -v OFS=':' '$1=$1'
######## 4.1 substr, index !!! 1 origin language
echo "abcde" |awk '{print substr($0, index($0,"b"))}'
######## 4.3 match
echo "abcde" | awk 'match($0, /c.*/)'
echo "abcde" | awk 'match($0, /c.*/){print substr( $0, RSTART, RLENGTH)}'
echo "echo \"abcde\" | grep -o 'c.*'"
echo "abcde" | grep -o 'c.*'
echo "abcde" | grep -o '.'
######## 5.2 atan2(y,x)=theta
echo "pi=" | awk '{print $0, atan2(0,-1)}'
######### gsub => sed 's/A/B/g'
echo "15 ab cd ef gh" | awk '$0 = gsub(/ab/, "") {print "contained"} '
echo "16 ab cd ef gh" | awk '! ($0 = gsub(/ac/, "")) {print "not contained"}'
echo "17 ab cd ef gh" | awk '$0 = gsub(/ac/, "") ""' #### print "0"
echo "17 ab cd ef gh" | awk 'split($0, array) {print array[1], array[4]}'
######### 2 Record
######### 2.1 row = record
######### RS: Record Separator
######### 2.2 NR: Number of Record
echo "seq 1 10 | awk 'NR>5'"
seq 1 10 | awk 'NR>5'
echo "seq 1 100 | tac | awk 'NR<=5' |tac"
seq 1 100 | tac | awk 'NR<=5' |tac
######### 2.5 Range like sed
echo "echo seq 1 100 | awk 'NR==10, NR==15'"
seq 1 100 | awk 'NR==10, NR==15'
echo "seq 1 100 | sed -e '1,9d' -e '16,\$d'"
seq 1 100 | sed -e '1,9d' -e '15,$d'
######### 2.7 grep
echo "seq 1 10 | awk '/[23]/'"
seq 1 10 | awk '/[23]/'
seq 1 10 | awk '$0 ~ /[23]/'
######### 2.8 grep -v
echo "seq 1 10 | awk '!/[3-8]/'"
seq 1 10 | awk '!/[3-8]/'
seq 1 10 | awk '$0 !~/[3-8]/'
######### 2.9 getline
seq 1 10 | awk 'BEGIN{
while (getline < "-" >0){
print $0, "NR = ", NR;
}
# close("-");
} '
######### 3.1 Fields, only variable FS can be passed directly like -F
######### other variables are passed via -v var=$VAR
echo "a, b, c" | awk -F',' '{print $2}'
VAR="awk"; echo "a, b, c" | awk -v var=$VAR '{print var, $2 }'
######### 3.3 FS can use regular expression
date | awk -F'[ :/]' '{print $0,"(->$2, $3)",$2, $3}'
echo "a b c" | awk '!($2 = "")' # awk '{$2 = ""; print}'
######### 3.4
# , is OFS (Output Field Separator)
# string can be concatenated with a spacen
echo "a b c" | awk '{i = 2; while(i <= NF){a = a OFS $(i++); print a}}'
######## 3.6 reconstruction of fields
echo "a,b,c" |awk -F',' -v OFS=':' '4'
echo "a,b,c" |awk -F',' -v OFS=':' '$1=$1'
######## 4.1 substr, index !!! 1 origin language
echo "abcde" |awk '{print substr($0, index($0,"b"))}'
######## 4.3 match
echo "abcde" | awk 'match($0, /c.*/)'
echo "abcde" | awk 'match($0, /c.*/){print substr( $0, RSTART, RLENGTH)}'
echo "abcde" | grep -o 'c.*'
echo "abcde" | grep -o '.'
######## 5.2 atan2(y,x)=theta
echo "pi=" | awk '{print $0, atan2(0,-1)}'
echo "######## 6.5 array"
echo -e "aaa\nbbb\naaa" | awk '!a[$0]++ {print} a[$0]{print "a[" $0 "]=" a[$0] }'
#echo -e "aaa\nbbb\naaa\naaa\nbbb\naaa" | awk 'a[$1]++ >=2{print} a[$0]++ ==1 {print} {print "---"}'
echo 'echo -e "aaa\nbbb\naaa" |sort|uniq -d'
echo -e "aaa\nbbb\naaa" |sort|uniq -d
echo "####### 8.1 systemtime(), strftime"
awk 'BEGIN {print strftime("%Y/%m/%d %H:%M:%S", systime())}'
echo "####### 8.2 gensub & gsub"
echo "gensub demo: sub and gsub rewrite \$0":
echo "sumomomo momonouchi" | awk '{ sub(/m/,"M"); print }'
echo "sumomomo momonouchi" | awk '{ gsub(/m/,"M"); print }'
echo "sumomomo momonouchi" | awk '{ str=gensub(/m/,"M","g",$0); print $0, str}'
echo "sumomomo momonouchi" | awk '{ str=gensub(/m/,"M","2",$0); print $0, str}'
echo "sumomomo momonouchi" | awk '{ print gensub(/(mo)(no)/,"\\1\"\\2\"","g",$0)}'
echo "sumomomo momonouchi" | sed 's/\(mo\)\(no\)/\1\"\2\"/g'
####### 8.3 |&
echo "a c b z e y f" | awk '
{
cmd="sort";
for(i=1; i<=NF; i++){print $i |& cmd}
close( cmd, "to")
str="";
while(cmd |& getline > 0){
str = str " " $0;
print
}
close(cmd);
print str;
} '
seq 1 10|rev|sort|xargs
echo "####### 9.1 FPAT: Field Pattern, OFS: Output Field Separator"
echo 'aaa, "bbb, ccc", ddd '
echo 'aaa, "bbb, ccc", ddd ' |awk -F, '{$1=$1;print $2}'
echo 'aaa, "bbb, ccc", ddd ' |awk -v FPAT='(\"[^\"]+\")|([^,]+)' '{$1=$1;print $1,$2, $3, $4}'
echo 'aaa, "bbb,ccc", ddd ' |awk -v FPAT='(\"[^\"]+\")|([^,]+)' '{print $1, $2}'
echo 'aaa, "bbb, ccc", ddd ' |awk -v FPAT='([^,]+)' '{OFS=";";print $1, $2, $3, $4}'
echo "### cat -"
ls -lg |awk '/^-rwx/{print $4}' | xargs |tr ' ' '+' |bc | for i in `cat -`; do echo $i "/1000"; done |bc|echo `cat -` "kb"
ls -lg |awk '/^-rwx/{print $4}' | xargs |tr ' ' '+' |bc| echo `cat -` "/1024" |bc|echo `cat -` "kb"
### 桁区切り
printf("# %\047d %\047d/%\047d\n", PMID, cnt, serial)
### stdout flush
if((matched % 100) == 0) printf("."); system("")
### getline
getline query < QY