awk常用命令
2019-12-26 本文已影响0人
生信编程日常
awk在处理文件的时候,常常比编写脚本更加方便,处理速度也更快,下边总结了一些awk的常用用法。
现在新建两个文件, test1.txt和test2.txt,对这两个文件进行处理。其中,test1.txt内容如下:
imagetest2.txt内容:
image- 输出某一列
$0为整行,$1 为第一列,$2为第二列…… 最后一列可以表示为$NF,倒数第二列为$(NF-1)…
awk -F '\t' '{print $1}' test1.txt # 输出第一列
awk -F '\t' '{print $2+1}' test1.txt # 输出第二列加1
awk -F '\t' '{print $0"\t"$2+1}' test1.txt
最后一行代码的输出为:
image- 输出某一行
awk 'NR==1{print}' test1.txt
- 比较两列是否相同
awk -F '\t' '$1==$2' test1.txt # 只有在相同的时候才会输出
4. 做四则运算
# shell中做运算是比较麻烦的,但是借助awk可以方便的实现
# 除法,并保留两位小数
num=1
awk 'BEGIN{printf "%.2f\n", ('$num'/10)}'
# 或者
echo "1" "10" | awk '{printf "%.2f\n", $1/$2}'
# 加法同理
echo "1" "10" | awk '{print $1+$2}'
5. 输出文件列数
head -n 1 test1.txt | awk -F '\t' '{print NF}'
- 比较两个文件某几列的交集
awk -F '\t' 'FNR==NR{x[$1"\t"$2];next} ($1"\t"$2 in x)' test1.txt test2.txt
# 等同于
awk -F '\t' 'FNR==NR{x[$1"\t"$2];next} {if ($1"\t"$2 in x) {print $0}}' test1.txt test2.txt
ps. FNR是当前文件的行号,NR是所有文件的总行号。当在处理第一个文件test1.txt的时候,FNR==NR,执行第一个大括号,也就是将test1.txt中的第一列和第二列存到数组x中,当处理到第二个文件test2.txt的时候,NR>FNR,执行第二个大括号,判断第二个文件的第一二列是否在数组x中。
7. 正则匹配
# 匹配第一列开头是^或者第二列开头和结尾是1的行
awk '{FS="\t"}{if($1~/^th/ || $2~/^1$/) {print $0}}' test1.txt
- 判断
# 输出第二列大于3的行
awk '$2>3' test1.txt
# 等同于
awk '{if ($2>3) {print $0}}' test1.txt
- 计算某一列总和/最大、小值
# 第二列总和
awk 'BEGIN{total=0}{total+=$2}END{print total}' test1.txt
# 最大值
awk 'BEGIN {max = 0} {if ($2+0>max+0) max=$2 fi} END {print max}' test1.txt
# 最小值
awk 'BEGIN{min = 10000}{if ($2+0<min+0) min=$2 fi}END{print min}' test1.txt
可以看到awk非常方便,短短一行代码即可实现别的语言好几行的内容,活用awk会节省许多时间。
欢迎关注!