1.實驗的文本 awk_test.txt
開頭為1,2,3君丁,各有五行。其中有些行的$6$7$8字段為空
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5
2 2 3 4 5 6 7 8
2 2 3 4 5
2 2 3 4 5 6 7 8
2 2 3 4 5
2 2 3 4 5
3 2 3 4 5 6 7 8
3 2 3 4 5 6 7 8
3 2 3 4 5
3 2 3 4 5 6 7 8
3 2 3 4 5
2. awk 統(tǒng)計列數(shù)
cat awk_test.txt | awk '{print NF}'
3.awk統(tǒng)計行數(shù) & awk 引用shell里的變量
lines=`cat awk_test.txt| wc -l`
echo ${lines}
export lines
awk '{printf("%d",ENVIRON["lines"])}' awk_test.txt
4.awk 內(nèi)置變量
ARGC 命令行參數(shù)個數(shù)
ARGV 命令行參數(shù)排列
ENVIRON 支持隊列中系統(tǒng)環(huán)境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數(shù)
FS 設(shè)置輸入域分隔符鹦马,等價于命令行 -F選項
NF 瀏覽記錄的域的個數(shù) (列數(shù))
NR 已讀的記錄數(shù) (從1到最后一行行號)
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
5. 篩選空字段
例如,找出$8字段為空的行
cat awk_test.txt | awk '$8 ~/^$/{print NR}'
6.演示
現(xiàn)在awk_test.txt變?yōu)?/p>
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5 6 7 8
1 2 3 4 5
1 2 3 4 5
問題:求非空$6的平均值
cat awk_test.txt | awk 'BEGIN{b=0;} $8 !~/^$/{a+=$8;b++;} END{printf("%d\t%d\n",a/b)}'
7.awk 中的正則表達忆肾、通配符
- ~荸频,匹配操作符, 用來在記錄或者域內(nèi)匹配正則表達式 (針對某列)
- 客冈!~表示不匹配
- *****可以和零個或多個任意字符匹配
- ?與任何單個字符匹配
- ** .** 匹配任何單個字符旭从,每行的換行符也算
- $匹配行結(jié)束符
- ^匹配一行的開始
- *****匹配0或多個正好在它之前的那個字符
- **用來屏蔽特殊字符的含義
-
+匹配前面的正則表達式的一次或多次出現(xiàn)。
一些連用的正則表達符號: - ^$ 表示空行
- ^.$* 表示整行
8. awk 中的BEGIN和END
BEGIN: awk開始掃描輸入之前執(zhí)行,可以在里面進行變量賦值和悦。
比如演示6中的BEGIN{b=0;} 退疫。 BEGIN 初始化結(jié)束以后,后面的{}才正式開始掃描輸入文件鸽素,默認以換行符為分隔褒繁。也可以更改,比如以:為分隔
awk -F ':' 'BEGIN {a=12;} {a+=$1;} END {print("%d\n",a)}' xxfile.txt
END:END之后列出的操作將在掃描完全部的輸入之后執(zhí)行馍忽,通常用于輸出最終結(jié)果棒坏。
9. awk 和shell 之間傳參
- shell 向 awk傳參
# 1. “‘ $var ’”
var=”test”
awk ‘BEGIN{print “‘$var'”}’
# 2. awk -v 用于參數(shù)較少的情況下
var=”this is a test”
awk -v awk_var=”$var” ‘BEGIN {print awk_var}’
- awk 向 shell 傳參