基本語法
- $n :當前記錄的第n個字段,比如n為1表示第一個字段,n為2表示第二個字段
- $0:執行過程中當前行的文本內容
- \t:制表符
- \n:換行符
- -F'[:#/]' : 定義三個分隔符,注意有-F和無-F的區別,無-F直接用空格作為分隔符
- BEGIN: 初始化代碼塊,在對每一行進行處理之前,初始化代碼,主要是引用全局變量,設置FS分隔符
- END:結尾代碼塊,在對每一行進行處理之后再執行的代碼塊,主要是進行最終計算或輸出結尾摘要信息
- 一行一行輸出file中內容:
awk '{print}' file
- 輸出相同個數的a行,一行只有一個a:
awk '{print "a"}' file
- 將每一行的第一個字段和a,分行輸出:
awk -F: '{print $1; print "a"}' file
- 輸出每一行的第一個字段后直接輸出a,不換行:
awk -F: '{print $1; print "a"}' file
- 輸出行號:
awk '{print NR,$0}' result
- 顯示第五行:
awk -F: 'NR==5{print}' result
- 每隔五行顯示:
awk -F: 'NR%5==1{print}' result
- 顯示第一個元素是開始時右端項非零元的第二個元素
awk '{if($1=="開始時右端項非零元:"){printf $2 "\t ";}}' result
統計文本信息
要統計的文本信息存在grade.txt中
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
則統計代碼如下:
awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno. Name No. Math English Computer Total\n";printf "------------------------------------------------------------\n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------\n";printf "%-24s %-7s %-9s %-20s \n","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' grade.txt
例子2
#!/bin/bash
dir=./data/KnapsepInstances/KnapsepInstances/CNLP
rm 1.out
for file in $dir/*.lp
do
filename=$(basename $file .lp)
echo $file
./bin/main $file > temp
awk -F" " '{if($2=="name:"){print$3}}' temp >>1.out
awk -F" " '{if($1=="LIFT"){print"LIFT time: "$4}}' temp >>1.out
awk -F" " '{if($1=="nodes"){print"Nodes: "$3}}' temp >>1.out
done