【AWK】 部分技巧
1、split
split($9,a,";");
a[0]
a[1]
a 是python 中的列表(自动根据存入数据类型,变为什么变量)
这里意思是使用分隔符 “;” ,分割第9列,分割元素存入a
可以作为列表,取相应的元素 a[0];a[1]
2、gsub
gsub("Ref","",$9);
单独一句,替换,这里是讲第9列 内容 "Ref" 替换为空字符串 "",直接在第九列$9生效
3、输入文件分隔符 FS
FS( Field Separator ) : 列分割符。决定了怎么将一行划分为几段。预设值是 空白符(空白和Tab)
awk ' FS=";" {print $1} '
以";",作为分隔符,输入元素
4、输出文件分隔符 OFS
awk ' OFS="\t" {print $1,$3,$4}
以tab,作为分隔符,输入元素;输出的内容是 第一、三、四列使用tab链接的字符串
5、读多个文件
(1)多文件区分读取
ARGIND :输入文件编号
awk 'ARGIND==1{ print NR }ARGIND==2{ print FNR }' A.gff B.fa
ARGIND==1{ do samething } 就是读 第一个参数 A.gff 时 做的操作
ARGIND==2{ do samething } 就是读 第二个参数 B.fa 时 做的操作
(2)多文件判断
NR:表示awk开始执行程序后所读取的数据行数。
FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。
awk ' NR==FNR{ do something }NR!=FNR{ do something }' A.gff B.fa
当NR 等于 FNR 时就是在读取第一个文件的时候
当NR 不等于 FNR 时就是再读取第二个文件的时候
和上面 ARGIND==1 ARGIND==2 同样作用,不过这种方法只能用于两个文件;两个以上文件需要用ARGIND 进行判断
5、哈希hash (字典dict)
和python 中的 字典一个意思
awk '{ a[$1]=$2;print a[$1]}'
直接就存入变量名a 中;自动按照字典方式存入
调用只需要a[ key ]即可, 变量名,可以随意不用a也行
6、匹配判断
if($0~/^>/){do something}
匹配的含义就是字符串中是否能找到/中的匹配内容/; 而// 中可以直接写正则表达式 表示一定规律的内容
正则表达式解释:
/^>/ 解释 :// 中的^ 三角角标 表示字符串"最前面" ; 这句话表示去匹配最前面的>大于号
结构
被匹配的字符串~/匹配内容/
~ 表示匹配
// 则用来限制匹配内容的范围
不匹配判断则是
if($0!~/^>/){do something}
解读一个例子;进行学习
awk 'ARGIND==1{if($3~/mRNA/){split($9,a,"ID=AA_");split(a[2],b,";");if($1~/LG/){split($1,c,"LG");$2="AA_"c[2]"g"b[1]}else{split($1,c,"scaffold_");$2="AA_"c[2]"s"b[1]}; d[">AA"b[1]]=$2;line=$1"\t"$2"\t"$4"\t"$5"\tAA"b[1];print line >>"genomic.new.mod.gff" }}ARGIND==2{if($0~/^>/){$1=">"d[$1]};{print $0 >>"aoaas.pep.mod.fa"}}' aoaas.gff aoaas.pep.fa
网友评论