第十一屆藍橋杯 國賽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可用性非常強,具體可以查詢官網學習。