awk
2020-08-09 本文已影响0人
斩毛毛
积累awk
# 按“:”来分割并打印出第一列
awk -F “:” ‘{print $1} file
# 输出^S 以S开头的那行
awk '/^S/{print ">""\n"}' file
# 输出12列等于60的所有行,¥0代表整行
awk -F "\t" '($12 == 60){print $0}' file
# 第一列大于100的行整行输出
awk ‘($1 > 100){print $0}’ file
# 对第一列大于100的行输出第一列和第二列的结果并以“\t”分割
awk ‘($1 > 100){print $1”\t”$2}’ file
# 对第三列匹配“world”的行的第一列求和,全部处理完之后输出结果x的值
awk ‘($3~/world/){ x+= $1}END{print x}’ file
# 只把每行的第一个AAAA替换为BBBB
awk '{sub(/AAAA/, "BBBB"); print $0}' file
# 把每一行的所有AAAA替换为BBBB
awk '{gsub(/AAAA/, "BBBB"); print $0}' file
# 只在出现字符串CCCC的前提下,将行中所有AAAA替换为BBBB
awk '/CCC/ {gsub(/AAAA/, "BBBB"); print $0; next}' t.txt
# 不管是AAAA,还是CCCC,全部替换为BBBB
awk '{sub(/AAAA|CCCC/, "BBBB"); print $0}' t.txt
# 把所有以A开头,不管后面连续包含几个A的串替换成一个字符B
awk '{ gsub(/^A/, "B" ); print $0}' t.txt
# ,(逗号) 表示的是一个范围,就是逗号前到逗号后作为一个范围。
内置变量
变量名 作用
$0 执行过程中当前行 的所有文本内容
$n 以xx为分隔符,当前行的第n个字段,$1为第一个字段…
FS 输入 字段 分隔符,默认为空白字符(搭配BEGIN语句块使用)
OFS 输出 字段 分隔符,默认为空白字符(搭配BEGIN语句块使用)
RS 输入 记录 分隔符,默认为换行符(搭配BEGIN语句块使用)
ORS 输出 记录 分隔符,默认为换行符(搭配BEGIN语句块使用)
NR 当前行号,从1开始;如果仅处理一个文件,可以将NR的值当为此文件的行号
FNR 用法同 NR 一样,不过是用来处理多个文件
NF 每一行中字段的总数
$NF 每行中最后一个字段
$(NF-1) 每行中的倒数第二个字段,以此类推 $(NF-2)为倒数第三
FILENAME 当前正在被处理的文件的文件名,一般结合 END{print FILENAME}语句块使用
FILEWIDTHS 由空格隔开iade定义了每个字段的宽度,即取代FS,由字段长度来决定如何分割字段的
ARGC 命令行中参数的数量,包括 awk 自己。结合 END{commands}语句块使用
ARGV 用法: END{print ARGV[0]} ,0表示命令行中的所有参数中的第一个,1为第二个
分号,以及逗号作用
- 分号表示一个范围
cat test
aaaa
bbbbb
cccc
dddd
eeee
awk 'NR==1,NR==3 {print NR,$0}' test
1 aaaa
2 bbbbb
3 cccc
# 从第一行到第三行到行
- 分号表示分割
awk 'NR==1,NR==3 {print NR;$0}' test
aaaa
3cccc
逻辑运算符
逻辑运算符
运算符 作用 解释
&& 逻辑和 双方都为真才成立
|| 逻辑或 只要有一个为真就成立
! 逻辑非(非真即假) !true =flase
打印单引号 和双引号
cat test
aaaa
bbbbb
cccc
dddd
eeee
awk '(/aa/){print "\""}' test
"
# 两个双引号将双引号扩起来,然后加入反斜杠
----------------------------------------
awk '(/aa/){print "\047"}' test
'
# 两个双引号扩起来,反斜杠047即可打印出单引号
设置变量 -v
awk -v a=1 '{print NR,NR+a}' test
1 2
2 3
3 4
4 5
5 6
反向输出条件
head new.out
C3-V3 39608170 G T T
C3-V3 39608473 T C C
C3-V3 39609017 R A A
C3-V3 39609297 T C C
C3-V3 39610251 C G G
## 输入基因型相同的点
awk '($3 == $4 && $4==$5){print $0}' new.out |head
C3-V3 39626261 T T T
C3-V3 39633487 C C C
C3-V3 39664073 R R R
## 输入基因型不相同的点
awk '!($3 == $4 && $4==$5){print $0}' new.out |head
C3-V3 39608170 G T T
C3-V3 39608473 T C C
C3-V3 39609017 R A A
循环筛选需要的列
awk '{printf $1"\t";for(i=2;i<=30;i+=2)printf $i"\t";printf $i"\n"}' test >out
打印出第一列, 对第二列,第四列。。。进行筛选输出
筛选需要的行(例如将fq2fa)
awk "NR % 4 == 2" test.fq | ...
行数/4 余数=2的行提取
if else
awk '{if ($1<=3) print $0;else print "3\t"$2"\t"$3}' ltr.txt |sort -k1,1n >ltr_lt3.txt
将第一列>3的数值全部变为3,<3的数字输出; 如果还想加else if,也可以在中间添加,每一个判断间用分号隔开
替换
cat a.txt
e d g e
s d g w
a x d g
n d I d
## 将第三列替换为xxx
awk '{$3 = "xxx"; print $0}' a.txt
e d xxx e
s d xxx w
a x xxx g
n d xxx d
## 指定替换,将第三列g变为N
awk '{sub("g","N", $3); print $0}' a.txt
删除特定列
和上述替换利用相同的原理,比如将第二列删除,则需要将其第二列替换为“”(仍然保留第二列,但是为空格)或者“\b”(将前一个字符移动到前面,即将第3列的字符移动到第二列,实现将第二列删除)
cat a.txt
e d g e
s d g w
a x d g
n d I d
# 将第二列删除 (仍然存在空格)
awk '{$2="";print $0}' a.txt |head
e g e
s g w
a d g
n I d
##去除空格 (得到数据为空格分割, 可以使用sed 将其再次变为tab符分割)
awk '{$2="\b";print $0}' a.txt |head
e g e
s g w
a d g
n I d
awk '{$2="\b";print $0}' a.txt |sed 's/ /\t/'g |head
e g e
s g w
a d g
n I d