2017年12月12日 星期二

[OS] 指令介紹 AWK

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 ($4awk 'BEGIN {min = 100} {if ($1 ~ /2|4/ &&$45 統計應用

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






沒有留言:

RHEL install EPEL

  https://www.linuxtechi.com/install-epel-repo-on-rhel-system/ EPEL dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest...