美文网首页Linux Perl
Perl单行(Perl One-Liners)命令

Perl单行(Perl One-Liners)命令

作者: Dawn_WangTP | 来源:发表于2019-12-29 19:32 被阅读0次

    Perl语言的一大好处就是,在日常处理各种小任务时,可以利用Perl单行的各种内置变量和参数快捷实现。本文记录平时做分析时常用的perl内置变量、基本参数和一些常用命令。

    个人博客原文地址

    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)

    对每行文件加空行:

    perl -pe '$\ = "\n"'
    perl -pe '$_ .="\n" unless /^$/ '
    

    去除空行:

    perl -ne 'print unless /^$/'
    perl -lne 'print if length'
    

    对行处理:编号、计数(Numbering)、选择目标行输出

    仅对非空行计数,并显示行号:

    perl -pe ' $_ .= "$.\t" ' file.txt
    perl -ne 'print ++$x . "\t$_" if /\S/' file.txt
    

    输出 匹配到pattern的行,并显示行号:

    perl -ne 'print unless /pattern/' file.txt ##除了目标匹配行
    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
    

    仅输出奇数行、偶数行:

    perl -ne 'print if $. % 2' text
    perl -ne 'print if $. %2==0' text
    

    仅输出文件中重复的行

    ### 出现两次就输出
    perl -ne 'print if ++$a{$_} ==2'
    

    去重复行,仅输出第一次出现的行

    perl -ne ' print unless $a{$_}++ ' file.txt
    

    计算相关

    输出第一列数字相加之和:

    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当中的10个随机数字

    perl -le 'print join ",", map { int(rand(15-5))+5 } 1..10'
    

    标量文字处理相关

    输出a到zz所有字母(..的使用)

    perl -le ' $,=","; print a..zz ' # print("a".."zz")
    

    输出指定长度的字符(x为重复)

    perl -le 'print "a"x50'
    

    输出从1~100的质数(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
    

    自动转换大小写字符 \u \L

    perl -lne 'print "\u$_"'
    perl -plne '$_=\L$_\E'
    perl -ple ' s/(\w+)/\u$1/g '
    

    去除每行开头、结尾的空格内容s///g

    perl -ple ' s/^\s+|\s+$//g '
    

    反向输出 数组的内容

    perl -F: -alne '$" = ","; print "@{[reverse @F]}"' file.txt # a:b:c:d:e
    

    生信常用perl脚本记录

    批量根据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文件转为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)

    相关文章

      网友评论

        本文标题:Perl单行(Perl One-Liners)命令

        本文链接:https://www.haomeiwen.com/subject/zgcuoctx.html