Linux命令awk,sed使用

awk 命令使用记录

例1, 修改fasta序列ID

awk 'BEGIN{Cnt=0}{if($0~/>/){Cnt=Cnt+1;tmp=">TriUnigene"Cnt; $0=tmp; print$0}else{print$0}}' file.fasta
# ID修改前
>TRINITY_DN8_c0_g1_i1 len=239 path=[0:0-238]
>TRINITY_DN78_c0_g1_i1 len=417 path=[0:0-416]
>TRINITY_DN53_c0_g1_i1 len=203 path=[0:0-202]
# ID修改后, 即使fasta文件序列有多行也可以使用 
>TriUnigene1
>TriUnigene2
>TriUnigene3

若后续只需要用到序列,不需要ID的信息,就可以把ID信息完全修改掉

例2:简化fasta序列名字

awk '{if($0~/>/){sub(/\..*/, "", $0); print$0}else{print$0}}' file.fasta

ID 修改前后对比

# 修改前
>Lycv20126160-mRNA-1.mrna1 gene=Lycv20126160-mRNA-1
>Lycv20064330-mRNA-1.mrna1 gene=Lycv20064330-mRNA-1
>Lycv20064340-mRNA-1.mrna1 gene=Lycv20064340-mRNA-1
# 修改后
>Lycv20126160-mRNA-1
>Lycv20064330-mRNA-1
>Lycv20064340-mRNA-1

例3,修改染色体名字,并保持染色体两位数字

修改fasta序列ID,ID加1同时字符部分替换为Chr,并保持两位数值

grep ">" Litchi_BMerged2A.genome.fna | awk '{if($0~/>/){split($0,a,"group");b=a[2]+1;if(length(b)<2){c="0"b}else{c=b};ID=">Chr"c;print ID}else{print$0}}'
>Bmerged2A_group0       >Chr01
>Bmerged2A_group10      >Chr11
>Bmerged2A_group11      >Chr12
>Bmerged2A_group12      >Chr13
>Bmerged2A_group13      >Chr14
>Bmerged2A_group14      >Chr15
>Bmerged2A_group1       >Chr02
>Bmerged2A_group2       >Chr03
>Bmerged2A_group3       >Chr04
>Bmerged2A_group4       >Chr05
>Bmerged2A_group5       >Chr06
>Bmerged2A_group6       >Chr07
>Bmerged2A_group7       >Chr08
>Bmerged2A_group8       >Chr09
>Bmerged2A_group9       >Chr10

其他

以下是其他一些情况的修改记录(笔者自己需要而写)

使用awk内置函数gsub

>Bradi1g47160.1.v3.1 替换为 >Bradi1g47160.1

awk '{if($0~/>/){gsub(/\.v3\.1/,"",$0);print$0}else{print$0}}' Brachypodium_distachyon.genome.modID.promoter

大小写转换,将 >Glyma.01G073300.1.Wm82.a2.v1 + Up_Stream_Len 2500 转为 >Glyma01g073300.1

awk '{if($0~/>/){gsub(/\.Wm82\.a2\.v1.*/,"",$0);split($0,a,".");a[2]=tolower(a[2]);$0=a[1]a[2]"."a[3];print$0}else{print$0}}' 
使用awk内置split函数,用来分隔字符
time="AB:12:ab"
out=`echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'`
echo $out

print打印中,以点号","间隔表示以输出分隔符(可以通过OFS指定)打印,以空格符号" "表示不以分隔符打印

awk 数组模式,

一、保留某字符特定前几行,命令表示只读取第一个字段第一次出现的行。

awk '{array[$1]++; if(array[$1]==1) print $0}' $sample
注: length为awk中的保留字符,不能拿来赋值

二、利用数组简单统计重复序列信息,BMerged2A.genome.fna.outRepeatMask的输出结果

tail -n +3 Litchi_BMerged2A.genome.fna.out | awk 'BEGIN{print "Repeat","Numbers","Length"}{tmp=$7-$6+1;arrayA[$11]+=tmp;arrayB[$11]++}END{for(key in arrayA)print key,arrayB[key],arrayA[key]}'

tail -n + 3表示不读取前三行,输出结果如下,由于循环问题,第二行(脚本额外生成)需要删除

Repeat Numbers Length
 1 1
LINE/L1 5508 3839687
Low_complexity 36060 1806624
DNA/hAT-Ac 1937 1019348
LTR/Gypsy 33902 61287663
Unknown 414560 137820270
LTR/Caulimovirus 1791 2250335
DNA/MuLE-MuDR 10824 10377274
LTR/Copia 21074 19759528
DNA/hAT-Tip100 1524 507589
DNA/hAT-Tag1 2248 1570480
DNA/CMC-EnSpm 2550 2237982
Simple_repeat 205035 12197075
DNA/PIF-Harbinger 2334 1025453

awk调用外部变量

tips1: 当调用的外部变量位置是在awk主句之中时,此时外部变量需要用括号内字符("''")去调用,如下例子:

str=Hello
awk 'BEGIN{print "'$str'"}'
awk 'BEGIN{tmp="'$str'";print tmp}'
# 以下7种都是错误引用形式
awk 'BEGIN{print '$str'}'
awk 'BEGIN{print "$str"}'
awk 'BEGIN{print '"$str"'}'
awk "BEGIN{print "'$str'"}"
awk "BEGIN{print '"$str"'}"
awk "BEGIN{print '$str'}"
awk "BEGIN{print "$str"}"

tips2: 当调用的外部变量位置是在awk内部函数之中时,如if, split, sub等,只可使用如下两种形式:

Str=EVM
awk '{if($2~/'$Str'/)print$0}' Litchi_BMerged2A.gff3 | cut -f2 | sort | uniq
awk '{if($2~/'"$Str"'/)print$0}' Litchi_BMerged2A.gff3 | cut -f2 | sort | uniq

第二部分 sed 命令

sed字符替换中使用变量

eval sed 's/$a/$b/' filename
sed "s/$a/$b/" filename
sed 's/'$a'/'$b'/' filename
sed s/$a/$b/ filename
# 全词匹配
sed 's/\<old\>/new/g' file
# 替换多个空格为一个,注意前面括号里面为空格
sed "s/[ ][ ]*/ /g"
# sed删除倒数n行
linenum=`cat file | wc -l`
linenum_last3=`expr $linenum - 4`
sed -n ''"$linenum_last3"'d' file

提取字符串,正则表达式匹配某字符串后,字符串某一部分保留为元组,然后打印

echo here365test | sed 's/.*ere\([0-9]*\).*/\1/g'

替换换行符,然后转为数学表达式并计算其值,

echo -e "3\n5\n6" |sed ":a;N;s/\\n/+/g;ba" | bc
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,375评论 0 5
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,088评论 0 0
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,560评论 0 4
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,196评论 2 25
  • 目录 Random类及其局限性示例分析 ThreadLocalRandom示例原理源码分析 更多 Random类及...
    2w6f8c阅读 712评论 0 4