首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >awk常用命令

awk常用命令

作者头像
生信编程日常
发布2020-04-01 15:38:27
5090
发布2020-04-01 15:38:27
举报

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会节省许多时间。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档