awk 分隔符
两种方式定义分隔符,OFS
定义输出的分隔符。
awk 'BEGIN {FS="\t";OFS=","} {print $1,$2,$3}'
awk -F "\t" '{print $1,$2,$3}'
awk -F "[ :]+" # 一个或多个" "":"
awk print
print与printf的主要区别:
- print 显示以默认分隔符分隔,
\n
结束符 - printf 更加灵活的控制输出格式,诸如%-12s,%3.1f等格式化方法
cat test.csv|awk -F "\t" '{print $1,$2,$3}'
awk 'BEGIN {per=12/3;printf"%3.3f\n",per}'
>> 0.333
awk 文本去重
awk '!a[$0]++' txt > drop.txt
awk 正则匹配某一域输出
匹配语句不套{},数据流会传到打印print处
第8列匹配日期202102、202103
cat data.csv | awk 'BEGIN {FS="\t"} $8~/20210[23]/ {print $0}' > res.csv
匹配第2列大于0.5,计算行数
cat data.txt | awk -F "\t" '$2 > 0.5 {print $0}' | wc -l
匹配时如果有多个条件:并&&
,或||
注意这里测试不要自己输入tab,发现自己输入的tab,awk按照4个空格做处理的
复杂例子
awk '/snaps1/ && $NF=="ZZZ"{s=$0} /Instance/ && s{print s ORS $0; s=""}' file
/snaps1/ && $NF=="ZZZ" # if line has "snaps1" and last field is "ZZZ"
{s=$0} # store current line in variable s
/Instance/ && s # if line has "Instance" and variable s is not empty
{print s ORS $0; s=""} # print variable s ORS and current line. Reset variable s