awk-基本使用

基本數據

godme  male   99
judas  female 100
foreva male   32
devil  female 73

運行方式

文件輸入

awk '{print}' table

管道連接

cat table | awk '{print}' 

程序文件

#!/bin/awk
# run.awk
{print}
awk -f run.awk table # -f 指定awk程序文件

參數

awk從輸入中解析參數,都是依據列來進行解析,並從1依次進行標記。

awk '{print $1, $3}' table
godme@~/project/awk$awk '$2 =="male" {print $1, $3}' table
godme 99
foreva 32

NF

awk會自動記錄參數個數,使用NF可直接獲取值

awk '{print NF, $NF}' table
godme@~/project/awk$awk '{print NF,$NF}' table
3 99
3 100
3 32
3 73

使用$NF,相當於獲取最後一個值,也就是index=1index = -1.

$0

從1開始,指定的都是每行的參數,$0指代的就是當前行,

awk '/godme/ { print $0}' table
# godme  male   99

NR

這個參數表示了所在的行號

awk '{print NR, $0}' table
# 1 godme  male   99
# 2 judas  female 100
# 3 foreva male   32
# 4 devil  female 73

命令格式

awk的格式分爲兩部分

  • 條件
  • 命令
awk ' $2 == "male" {print}' table # awk ' condition {operation}' input_file
godme@~/project/awk$awk '$2 =="male" {print}' table
godme  male   99
foreva male   32

條件

  • 比較
awk '$3 == 99 {print}' table
# godme  male   99
awk '$1 == "godme" {print}' table # 字符串記得引號
# godme  male   99
awk '$3 > 80 {print}' table
# godme  male   99
# judas  female 100
awk '$3 < 80 {print}' table
# foreva male   32
# devil  female 73
awk '$3 != 99 {print}' table
# judas  female 100
# foreva male   32
# devil  female 73
  • 結合
awk '$3 < 70 || $3 > 99 {print}' table  
# judas  female 100
# foreva male   32
awk '$3 > 70 && $3 < 100 {print}' table
# godme  male   99
# devil  female 73
awk '!($3 > 70 && $3 < 100) {print}' table
# judas  female 100
# foreva male   32
  • 正則
awk '/godme/ {print}' table
# godme  male   99

操作

這裏只簡單介紹printf操作,更多操作後續說明。

format description
%s 以字符串形式輸出
%f 以浮點數輸出

浮點數格式說明

format description
%6f 長度6
%6.2f 長度6,2位有效數字
%-9f 長度9,左對齊
awk '{printf("%-9s %5f  %8.2f\n", $1, $3, $3)}' table
# godme     99.000000     99.00
# judas     100.000000    100.00
# foreva    32.000000     32.00
# devil     73.000000     73.00

還可以結合sort進行排序操作

awk '{print $NF, $0}' table | sort 
# 100 judas  female 100
# 32 foreva male   32
# 73 devil  female 73
# 99 godme  male   99 序號是錯誤的,但是第一個數字是正確的,應該以數值來進行排序
awk '{print $NF, $0}' table | sort  -n
# 32 foreva male   32
# 73 devil  female 73
# 99 godme  male   99
# 100 judas  female 100

分段

awk '{age = age + $NF} END {print "sum age : ", age}' table
# sum age :  304

END分隔的兩部分操作,前一段每次都會執行,遍歷完畢以後執行END的語句。

利用awk的天然數值計算,還可以求平均

awk '{age = age + $NF} END {print "average age : ", age / NR}' table
# average age :  76
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章