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

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

例2:簡(jiǎn)化fasta序列名字

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

ID 修改前后對(duì)比

# 修改前
>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,修改染色體名字,并保持染色體兩位數(shù)字

修改fasta序列ID,ID加1同時(shí)字符部分替換為Chr,并保持兩位數(shù)值

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內(nèi)置函數(shù)gsub

>Bradi1g47160.1.v3.1 替換為 >Bradi1g47160.1

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

大小寫轉(zhuǎn)換,將 >Glyma.01G073300.1.Wm82.a2.v1 + Up_Stream_Len 2500 轉(zhuǎn)為 >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內(nèi)置split函數(shù),用來分隔字符
time="AB:12:ab"
out=`echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'`
echo $out

print打印中,以點(diǎn)號(hào)","間隔表示以輸出分隔符(可以通過OFS指定)打印,以空格符號(hào)" "表示不以分隔符打印

awk 數(shù)組模式,

一、保留某字符特定前幾行,命令表示只讀取第一個(gè)字段第一次出現(xiàn)的行。

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

二、利用數(shù)組簡(jiǎn)單統(tǒng)計(jì)重復(fù)序列信息,BMerged2A.genome.fna.outRepeatMask的輸出結(jié)果

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表示不讀取前三行,輸出結(jié)果如下,由于循環(huán)問題,第二行(腳本額外生成)需要?jiǎng)h除

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調(diào)用外部變量

tips1: 當(dāng)調(diào)用的外部變量位置是在awk主句之中時(shí),此時(shí)外部變量需要用括號(hào)內(nèi)字符("''")去調(diào)用,如下例子:

str=Hello
awk 'BEGIN{print "'$str'"}'
awk 'BEGIN{tmp="'$str'";print tmp}'
# 以下7種都是錯(cuò)誤引用形式
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: 當(dāng)調(diào)用的外部變量位置是在awk內(nèi)部函數(shù)之中時(shí),如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
# 替換多個(gè)空格為一個(gè),注意前面括號(hào)里面為空格
sed "s/[ ][ ]*/ /g"
# sed刪除倒數(shù)n行
linenum=`cat file | wc -l`
linenum_last3=`expr $linenum - 4`
sed -n ''"$linenum_last3"'d' file

提取字符串,正則表達(dá)式匹配某字符串后,字符串某一部分保留為元組,然后打印

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

替換換行符,然后轉(zhuǎn)為數(shù)學(xué)表達(dá)式并計(jì)算其值,

echo -e "3\n5\n6" |sed ":a;N;s/\\n/+/g;ba" | bc
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,715評(píng)論 0 5
  • 基礎(chǔ)命令 主要的命令和快捷鍵 Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,219評(píng)論 0 0
  • awk介紹awk變量printf命令:實(shí)現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,738評(píng)論 0 4
  • 轉(zhuǎn)載 原文的排版和內(nèi)容都更加友好,并且詳細(xì),我只是在這里貼出了一部分留作自己以后參考和學(xué)習(xí),如希望更詳細(xì)了解AWK...
    XKirk閱讀 3,365評(píng)論 2 25
  • 目錄 Random類及其局限性示例分析 ThreadLocalRandom示例原理源碼分析 更多 Random類及...
    2w6f8c閱讀 769評(píng)論 0 4

友情鏈接更多精彩內(nèi)容