1. 程式人生 > 其它 >第十一屆藍橋杯 國賽E.本質上升序列

第十一屆藍橋杯 國賽E.本質上升序列

語法:

awk 'pattern{action}'

 

awk上下文變數

開始BEGIN 結束END

行數 NR

欄位與欄位數$1 $2...

整行$0

欄位分隔符FS

輸出資料的欄位分隔符 OFS

記錄分隔符 RS

輸出欄位的行分隔符 ORS

 

欄位變數用法

-F 制定欄位分隔符

BEGIN{FS="_"}也可以表示分隔符

$0代表當前記錄

$1代表第一個欄位

$N代表第n個欄位

$NF 代表最後一個欄位

$(NF-1) 代表倒數第二個欄位

 

pattern表示式

正則匹配$1 ~/pattern/

比較表示式 $2 > 2  

 

awk pattern 匹配表示式案例

開始和結束 awk 'BEGIN{}END{}'

正則匹配

整行匹配 awk ‘/sunning/'

欄位匹配 awk '$2 ~/xxx/'

行數表示式

取第二行awk 'NR==2'

去掉第一行awk 'NR>1'

區間選擇

awk '/aa/, /bb/'

--> 列印從匹配到aa的行開始,到匹配到bb的行結束

awk '/1/, NR==2'

--> 列印從匹配到1的行開始,到第二行結束

 

action行為表示式

列印 {print $0}

賦值{$1 = 'abc'}

處理函式

原始內容 $0

更新後內容{$1=$1;print $0}

 

 

例子:

原始資料:

a:b:c
1111111111
222aa
root 192.168.1.1


manshuo@Dashuo:~/tem

 

--> 以 . 為分隔符,單行變多行

cat demo_awk.txt | awk 'BEGIN{RS="."}{print $0}'
#以RS分隔符來劃分,然後輸出為多行  

a:b:c
1111111111
222aa
root 192
168
1
1


-->多行變單行

cat demo_awk.txt | awk 'BEGIN{ORS=" "}{print $0}'

#ORS為組合後分隔符

a:b:c 1111111111 222aa root 192.168.1.1

 

計算平均數

把每一列的第二個數字相加並最後除以行數求平均數

echo

'1,10

2,20

3,30' |awk 'BEGIN{total = 0;FS=","}{total+=$2}END{print total/NR}'

20

 

awk的詞典結構array

陣列array:

'a,1,10

a,2,10

a,3,20

b,1,3

b,2,3

b,3,4'

 

awk可用性非常強,具體可以查詢官網學習。