Perl語言的一大好處就是,在日常處理各種小任務(wù)時,可以利用Perl單行的各種內(nèi)置變量和參數(shù)快捷實現(xiàn)壮虫。本文記錄平時做分析時常用的perl內(nèi)置變量奋岁、基本參數(shù)和一些常用命令思瘟。
Perl單行基本參數(shù)
-
-e
所有perl one-liner都需要添加的參數(shù) -
-n
將會循環(huán)讀入每行文件,輸出需要加‘print’ -
-p
將會直接print每行 -
-i
直接在源文件里進(jìn)行修改了闻伶。 -i.bak 源文件備份 -
-l
將會使輸入字符串去掉回車符號滨攻,而輸出再加上回車符號。 -
-a
以空格為分割輸入蓝翰,并將分割的結(jié)果自動保存到@F數(shù)組中光绕。 -
-F
指定分割符號,需要與-a一起用直接加分割符號: 如perl -F:畜份,可以使用正則表達(dá)式诞帐;可利用scalar @F
查報錯。
常用perl -F, -alne
:自動以,為分割符號爆雹,保存到數(shù)組@F中停蕉,循環(huán)讀取每行并去除末位\n符號。
Perl常用內(nèi)置變量(predefined variables)
-
$_
默認(rèn)為每行的內(nèi)容 -
$.
為每行的行號數(shù)字钙态,類似于awk中的NR -
$/
輸入的每行的分隔符慧起,默認(rèn)是\n,windows下有些文件是\n\r結(jié)尾。 -
$\
輸出的每行的分隔符册倒◎炯罚可指定 -
$1, $2, $3
正則表達(dá)式中匹配到括號里的內(nèi)容,從里往外數(shù) -
$,
標(biāo)量之間的分割符號驻子,例如perl -le '$,=":"; print 1, 2, 3'
-
$"
數(shù)組中的每個標(biāo)量的分隔符灿意,默認(rèn)直接print數(shù)組是以\s空格分開。perl -le '$"=":";@data=(1,2,3);print "@data"'
-
$反引號 $&, $'
: 正則表達(dá)式中崇呵,匹配內(nèi)容前缤剧、匹配內(nèi)容、匹配內(nèi)容后會默認(rèn)賦值給這三個變量域慷。實用 -
@F
-a鞭执、-F參數(shù)將每行分割的內(nèi)容自動加到數(shù)組@F中 -
@ARGV
最常用的接受文件命令 -
%ENV
系統(tǒng)環(huán)境中的一些變量加載到%ENV哈希中
間距司顿、空行(spacing)
對每行文件加空行:
perl -pe '$\ = "\n"'
perl -pe '$_ .="\n" unless /^$/ '
去除空行:
perl -ne 'print unless /^$/'
perl -lne 'print if length'
對行處理:編號、計數(shù)(Numbering)兄纺、選擇目標(biāo)行輸出
僅對非空行計數(shù)大溜,并顯示行號:
perl -pe ' $_ .= "$.\t" ' file.txt
perl -ne 'print ++$x . "\t$_" if /\S/' file.txt
輸出 匹配到pattern的行,并顯示行號:
perl -ne 'print unless /pattern/' file.txt ##除了目標(biāo)匹配行
perl -ne 'print "$.\t$_" if /regex/ ' file.txt
perl -ne 'print ++$x."\t$_" if /reads/ ' test.log
輸出匹配到pattern行的下面的一行:
perl -ne ' if($p=0){print; $p=0} $p++ if /pattern/ ' file.txt
perl -ne '$p && print && ($p=0); $p++ if /pattern/' file.txt
perl -ne '$p && print; $p = /science/'
輸出匹配到/AAA/和/BBB/的行:
perl -ne '/AAA/ && /BBB/ && print'
輸出第13行估脆、或除了第13行钦奋;輸出第13、19疙赠、50行付材;輸出13~40行
perl -ne 'print if $. == 13' file.txt
perl -ne 'print if $. != 13' file.txt
perl -ne '$. == 13 && print && exit'
perl -ne 'print if $.==13 || $.==19 || $.==40' file.txt
perl -ne 'print if $.>=13 && $.<=40' file.txt
perl -ne 'print if 13..40' file.txt
輸出START和END之間的行if/unless:
perl -i.old -ne 'print if /^START$/ .. /^END$/' foo.txt
僅輸出奇數(shù)行、偶數(shù)行:
perl -ne 'print if $. % 2' text
perl -ne 'print if $. %2==0' text
僅輸出文件中重復(fù)的行:
### 出現(xiàn)兩次就輸出
perl -ne 'print if ++$a{$_} ==2'
去重復(fù)行圃阳,僅輸出第一次出現(xiàn)的行:
perl -ne ' print unless $a{$_}++ ' file.txt
計算相關(guān)
輸出第一列數(shù)字相加之和:
perl -alne '$sum+=$F[0];END{print $sum}' file.txt
輸出時間:
perl -le 'print scalar(localtime)'
perl -le 'print join ":", (localtime)[2,1,0] '
輸出從5~15當(dāng)中的10個隨機(jī)數(shù)字
perl -le 'print join ",", map { int(rand(15-5))+5 } 1..10'
標(biāo)量文字處理相關(guān)
輸出a到zz所有字母(..的使用)
perl -le ' $,=","; print a..zz ' # print("a".."zz")
輸出指定長度的字符(x為重復(fù))
perl -le 'print "a"x50'
輸出從1~100的質(zhì)數(shù)(grep用法)
perl -le '@even = grep {$_ % 2 == 0} 1..100; print "@even"'
``
利用tr(y)修改字符
```perl
perl -le '$string = "bananas"; $string =~ y/A-Za-z/N-ZA-Mn-za-m/; print $string'
perl -lpe 'y/A-Za-z/N-ZA-Mn-za-m/' bananas.txt
自動轉(zhuǎn)換大小寫字符 \u \L
perl -lne 'print "\u$_"'
perl -plne '$_=\L$_\E'
perl -ple ' s/(\w+)/\u$1/g '
去除每行開頭厌衔、結(jié)尾的空格內(nèi)容s///g
perl -ple ' s/^\s+|\s+$//g '
反向輸出 數(shù)組的內(nèi)容
perl -F: -alne '$" = ","; print "@{[reverse @F]}"' file.txt # a:b:c:d:e
生信常用perl腳本記錄
批量根據(jù)id提取序列
perl -lne 'if($switch){if(/^>/){$flag=0;m/^>?(\S+).*?$/;$flag=1 if $need{$1};}print if $flag}else{m/^>?(\S+).*?$/;$need{$1}++}$switch=1 if eof(ARGV)' id.txt seq.fasta >seq_id.fas
FastQ文件轉(zhuǎn)為FastaA文件
perl -e '{ while($id=<>) { chomp $id; chomp ($seq=<>); <>; <>; $id=~s/^@/>/;print " $id\n$seq\n"; } }' file.fq >file.fa
參考資料:Perl One-liners (https://catonmat.net/books)