生物信息学与算法生物信息编程

awk常用命令

2019-12-26  本文已影响0人  生信编程日常

awk在处理文件的时候,常常比编写脚本更加方便,处理速度也更快,下边总结了一些awk的常用用法。

现在新建两个文件, test1.txt和test2.txt,对这两个文件进行处理。其中,test1.txt内容如下:

image

test2.txt内容:

image
  1. 输出某一列

$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
  1. 输出某一行
awk 'NR==1{print}' test1.txt
  1. 比较两列是否相同
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}'
  1. 比较两个文件某几列的交集
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
  1. 判断
# 输出第二列大于3的行
awk '$2>3' test1.txt
# 等同于
awk '{if ($2>3) {print $0}}' test1.txt
  1. 计算某一列总和/最大、小值
# 第二列总和
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会节省许多时间。

欢迎关注!

上一篇下一篇

猜你喜欢

热点阅读