AWK
參考
https://www.tutorialspoint.com/awk/awk_built_in_functions.htm
只能例舉比較常使用的,AWK真的太大了
apuser@db01 tmp$ cat mark.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
apuser@db01 tmp$
最基本的用法
1 標準用法 印出第一,三欄
apuser@db01 tmp$ awk '{print $1 , $3}' mark.txt
1) Physics
2) Maths
3) Biology
4) English
5) History
2 加入搜尋
2 標準用法 加入搜尋
apuser@db01 tmp$ awk '/Amit/{print $1 , $3}' mark.txt
1) Physics
apuser@db01 tmp$ awk '/Amit|Shyam/{print $1 , $3}' mark.txt
1) Physics
3) Biology
apuser@db01 tmp$
apuser@db01 tmp$ awk '/Amit|Shyam/{print }' mark.txt
1) Amit Physics 80
3) Shyam Biology 87
apuser@db01 tmp$
3 把搜尋變成判斷式
3 標準用法 加入判斷
3.0 標準 if
apuser@db01 tmp$ awk '{if ($1 ~ /1|2|3/) print }' mark.txt
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
3.1 使用取代指令 gsub ( r , s [, t] )
apuser@db01 tmp$ awk '{gsub( ")","",$1)} { if ($1 > 2)print }' mark.txt
3 Shyam Biology 87
4 Kedar English 85
5 Hari History 89
4 綜合應用
4 計算
4.0 計算加總
apuser@db01 tmp$ awk '{A+=$4} END{ print A}' mark.txt
431
4.0 + 3.1
apuser@db01 tmp$ awk '{gsub( ")","",$1)} { if ($1 > 2) A+=$4 }END{print A}' mark.txt
261
4.1 最大值,最小值
最大值
apuser@db01 tmp$ awk 'BEGIN {max = 0} {if ($4>max) max=$4 fi} END {print "Max=", max}' mark.txt
Max= 90
最小值
apuser@db01 tmp$ awk 'BEGIN {min = 100} {if ($4
apuser@db01 tmp$ cat a.txt
a|aa|2
b|aa|1
c|aa|3
d|bb|2
c|bb|2
5 統計
distinct
apuser@db01 tmp$ awk -F'|' '{a[$2]++}END {for (b in a) print b }' a.txt
bb
aa
distinct count
apuser@db01 tmp$ awk -F'|' '{a[$2]++}END {for (b in a) print b , a[b] }' a.txt
bb 2
aa 3
$ awk '{k=$1; v=$2; sum[k]+=v; count[k]++}
!(k in min){min[k]=max[k]=v}
min[k]>v{min[k]=v}
max[k]<v{max[k]=v}
END{for(k in sum) print k,min[k],max[k],sum[k]/count[k]}' file |
column -t
6 該知道的東西
內建變數
-F , FS 分隔符號
Syntax:
$ awk -F 'FS' 'commands' inputfilename
(or)
$ awk 'BEGIN{FS="FS";}'
apuser@db01 tmp$ echo "1|2|3" | awk -F'|' '{print $2, $3}'
2 3
apuser@db01 tmp$ echo "1|2|3" | awk 'BEGIN{FS="|"}{print $2, $3}'
2 3
OFS 吐出來的分隔符號
apuser@db01 tmp$ echo "1|2|3" | awk 'BEGIN{FS="|" ;OFS="="}{print $2, $3}'
2=3
7 shell變數用法
與Shell 傳來傳去
用法1
apuser@db01 tmp$ VAR="ABCD 1234"
apuser@db01 tmp$ awk 'BEGIN{ print "'"$VAR"'"}'
ABCD 1234
用法2
apuser@db01 tmp$ export VAR1="AB 123"
apuser@db01 tmp$ awk 'BEGIN{print ENVIRON["VAR1"]}'
AB 123
apuser@db01 tmp$
用法3
apuser@db01 tmp$ VARA=10
apuser@db01 tmp$ VARB=20
apuser@db01 tmp$ awk -v awk_var1="${VARA}" -v awk_var2="${VARB}" \
'BEGIN{print awk_var1 + awk_var2}'
30
apuser@db01 tmp$
9 awk變數用法
與Shell 傳來傳去 2
apuser@db01 tmp$ VAR=`echo "1|2|3" | awk -F'|' '{print $2, $3}'`
apuser@db01 tmp$ echo $VAR
2 3
apuser@db01 tmp$ set -- $VAR
apuser@db01 tmp$ VAR1=$1
apuser@db01 tmp$ VAR2=$2
apuser@db01 tmp$ echo $VAR1
2
apuser@db01 tmp$ echo $VAR2
3
apuser@db01 tmp$
前一欄,前二欄
echo '| Angry Birds|Arcade & Action|4.6|887,058|10,000,000 - 50,000,000|Free|August 30, 2011|1.6.3|19M|1.6 and up|Low Maturity | '| awk -F'|' '{print $(NF-1)}{print $12}'
二行合併
echo ' A | ios
A | 1.3.2
B | and
B | 1.3.1' | awk '{if (NR%2==0){print $3 }else{printf "%s ",$0}}'
三行合併
echo 'A| 0123
A | ios
A | 1.3.2
B | 0456
B | and
B | 1.3.1' | awk -F'|' 'ORS=NR%3?" ":"\n"{print "| " ,$0}'
out :
| A| 0123 | A | ios | A | 1.3.2
| B | 0456 | B | and | B | 1.3.1
awk 合并相同列的行
如果第一列与第二列相同,就合并行
cat a.txt
a b c
a b d
a b e
结果为 a b c e d
awk '{v=$1" "$2;a[v]=a[v]$3}END{for (j in a) print j,a[j]}' file
沒有留言:
張貼留言