????我發(fā)現(xiàn)只要一開始做課題,永遠(yuǎn)不會(huì)少的東西就是問題。
????昨天剛剛總結(jié)了關(guān)于awk如何統(tǒng)計(jì)某列最大最小值的問題,今天又遇到一個(gè)很有意思的awk特例,問題來源于同組同學(xué)。
????她詢問我,有以下的蛋白質(zhì)FASTA文件,她想要提取出標(biāo)題行的第8列信息重新命名標(biāo)題行應(yīng)該怎么做?
????需求如下:
#Raw Data
>Sample||0001||1284267||1285379||mRNA||1||CDS||936861456||1||frame0
Protein Sequence
...
#Results
>936861456
Protein Sequence
...
????我一看,這個(gè)還挺簡(jiǎn)單的,直接awk走起不就完事了嗎?
awk -F"||" '{if($0~/^>/)print ">"$8;else print $0}' fastafile > test.txt
????結(jié)果出來我傻了,標(biāo)題行的編號(hào)去哪兒了?怎么只剩下一個(gè)孤零零的大于號(hào),仿佛在嘲笑我的悲傷無限大……
????最好的老師永遠(yuǎn)是度娘,搜索之后我得知,||這樣的字符在awk中屬于特殊的分隔符,不能夠直接匹配,需要先用單括號(hào)括起來,再加上雙反斜線\\進(jìn)行轉(zhuǎn)義才能夠匹配,于是命令就變成了:
awk -F'\\|\\|' '{if($0~/^>/)print ">"$8;else print $0}' fastafile > test.txt
????這樣總算能夠正常輸出結(jié)果啦,其實(shí)在awk中這樣的特殊分隔符還有很多,例如\、<、>、(、)、\n、\t、&、;、'、"、管道符、空格或反引號(hào)等在shell中有特殊意義的字符作為分隔符,那么都要使用雙引號(hào)或者單引號(hào)把它們先包裹起來;還有就是像我今天遇到的這樣多個(gè)特殊字符作為分隔符,例如$、^、*、(、)、[、]、?、.、|,都要會(huì)用雙反斜線\\進(jìn)行轉(zhuǎn)義,當(dāng)然用兩個(gè)以上的反斜線也是可以的,不過外面一定記得使用單括號(hào)。
????今天又是為awk深深折服的一天,給跪啦!