Perl單行(Perl One-Liners)命令

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結尾。
  • $\ 輸出的每行的分隔符??芍付?/li>
  • $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)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,434評論 0 5
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,497評論 0 17
  • Perl 6 單行程序 這本書在進行之中。我希望你能覺得它有趣,甚至可能有用!如果你想貢獻反饋的話,那么很歡迎提問...
    焉知非魚閱讀 1,284評論 3 5
  • /顧城/ 你不愿意種花 你說:“我不愿意看見它一點點凋落”是的,為了避免結束 你避免了一切開始 顧城:195...
    騎士658閱讀 1,192評論 1 4
  • 今天的走勢,開始看著其他外盤的走勢,有點嚇人,但是要堅定的相信自己的判斷,所以,我是堅持了的。這點值得自我夸耀。 ...
    那一葉秋閱讀 99評論 0 0