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
上一篇下一篇

猜你喜欢

热点阅读