Perl单行基本参数
-e
所有perl one-liner都需要添加的参数-n
将会循环读入每行文件,输出需要加‘print’-p
将会直接print每行-i
直接在源文件里进行修改了。 -i.bak 源文件备份-l
将会使输入字符串去掉回车符号,而输出再加上回车符号。-a
以空格为分割输入,并将分割的结果自动保存到@F数组中。-F
指定分割符号,需要与-a一起用直接加分割符号: 如perl -F:,可以使用正则表达式;可利用scalar @F
查报错。
常用perl -F, -alne
:自动以,为分割符号,保存到数组@F中,循环读取每行并去除末位\n符号。
Perl常用内置变量(predefined variables)
$_
默认为每行的内容$.
为每行的行号数字,类似于awk中的NR$/
输入的每行的分隔符,默认是\n,windows下有些文件是\n\r结尾。$\
输出的每行的分隔符。可指定$1, $2, $3
正则表达式中匹配到括号里的内容,从里往外数$,
标量之间的分割符号,例如perl -le '$,=":"; print 1, 2, 3'
$"
数组中的每个标量的分隔符,默认直接print数组是以\s空格分开。perl -le '$"=":";@data=(1,2,3);print "@data"'
$反引号 $&, $'
: 正则表达式中,匹配内容前、匹配内容、匹配内容后会默认赋值给这三个变量。实用@F
-a、-F参数将每行分割的内容自动加到数组@F中@ARGV
最常用的接受文件命令%ENV
系统环境中的一些变量加载到%ENV哈希中
间距、空行(spacing)
对每行文件加空行:
1 | perl -pe '$\ = "\n"' |
去除空行:
1 | perl -ne 'print unless /^$/' |
对行处理:编号、计数(Numbering)、选择目标行输出
仅对非空行计数,并显示行号:
1 | perl -pe ' $_ .= "$.\t" ' file.txt |
输出 匹配到pattern的行,并显示行号:
1 | perl -ne 'print unless /pattern/' file.txt ##除了目标匹配行 |
输出匹配到pattern行的下面的一行:
1 | perl -ne ' if($p=0){print; $p=0} $p++ if /pattern/ ' file.txt |
输出匹配到/AAA/和/BBB/的行:
1 | perl -ne '/AAA/ && /BBB/ && print' |
输出第13行、或除了第13行;输出第13、19、50行;输出13~40行
1 | perl -ne 'print if $. == 13' file.txt |
输出START和END之间的行if/unless:
1 | perl -i.old -ne 'print if /^START$/ .. /^END$/' foo.txt |
输出文件第三列、5列、最后一列或者1到20列:
1 | perl -F"\t" -alne 'print join "\t", @F[2,4,-1]' |
仅输出奇数行、偶数行:
1 | perl -ne 'print if $. % 2' text |
仅输出文件中重复的行:
1 | ### 出现两次就输出 |
去重复行,仅输出第一次出现的行:
1 | perl -ne ' print unless $a{$_}++ ' file.txt |
计算相关
输出第一列数字相加之和:
1 | perl -alne '$sum+=$F[0];END{print $sum}' file.txt |
输出时间:
1 | perl -le 'print scalar(localtime)' |
输出从5~15当中的10个随机数字
1 | perl -le 'print join ",", map { int(rand(15-5))+5 } 1..10' |
标量文字处理相关
输出a到zz所有字母(..的使用)
1 | perl -le ' $,=","; print a..zz ' # print("a".."zz") |
输出指定长度的字符(x为重复)
1 | perl -le 'print "a"x50' |
输出从1~100的质数(grep用法)
1 | perl -le '@even = grep {$_ % 2 == 0} 1..100; print "@even"' |
自动转换大小写字符 \u \L
1 | perl -lne 'print "\u$_"' |
去除每行开头、结尾的空格内容s///g
1 | perl -ple ' s/^\s+|\s+$//g ' |
反向输出 数组的内容
1 | perl -F: -alne '$" = ","; print "@{[reverse @F]}"' file.txt # a:b:c:d:e |
在第N列之后添加新的一列:
1 | perl -i -F"\t" -alne 'print join "\t", @F[0..N-1], "NEW_column", @F[N..$#F]' |
在第N行之后添加新的一行:
1 | perl -pe 'print "text\n" if $. == N; $. = 0 if eof' |
生信常用perl脚本记录
批量根据id提取序列
1 | 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文件转为FastaA文件
1 | perl -e '{ while($id=<>) { chomp $id; chomp ($seq=<>); <>; <>; $id=~s/^@/>/;print " $id\n$seq\n"; } }' file.fq >file.fa |
VCF文件中的第三列添加ID信息,以”chr:pos”命名
1 | perl -alne 'print if/^#/;unless(/#/){$F[2]="$F[0]:$F[1]";$"="\t"; print"@F"}' test.vcf |
移动小于2000bytes的文件到另外的文件夹中
1 | ls -l *xls | perl -F'/\s+/' -alne 'print "$F[8]\n" if $F[4] < 1000' |xargs -i mv {} ../DIR |