2013-12-18 26 views
1

我試圖讓一個Perl的一行工作編輯:使用開始塊,而在地方用Perl一行代碼

$ perl -aln -F"\t" -i -e 'BEGIN{print qq(taxid:int:ncbitaxid\tname\tl:label)} print qq($F[0]\t$F[1]\trank,$F[2])' testing 

用於測試的輸入文件看起來是這樣的:

1 root no rank 
2 Bacteria superkingdom 
6 Azorhizobium genus 
7 Azorhizobium caulinodans species 
9 Buchnera aphidicola species 
10 Cellvibrio genus 
11 [Cellvibrio] gilvus species 
13 Dictyoglomus genus 
14 Dictyoglomus thermophilum species 
16 Methylophilus genus 

所需的輸出看起來是這樣的:

taxid:int:ncbitaxid name l:label 
1 root rank,no rank 
2 Bacteria rank,superkingdom 
6 Azorhizobium rank,genus 
7 Azorhizobium caulinodans rank,species 
9 Buchnera aphidicola rank,species 
10 Cellvibrio rank,genus 
11 [Cellvibrio] gilvus rank,species 
13 Dictyoglomus rank,genus 
14 Dictyoglomus thermophilum rank,species 
16 Methylophilus rank,genus 

我已經能夠使用這下面來重建,但我想在地方編輯,不打印到另一個文件。

perl -aln -F"\t" -e 'BEGIN{print qq(taxid:int:ncbitaxid\tname\tl:label)} print qq($F[0]\t$F[1]\trank,$F[2])' testing 
+0

你得到的錯誤是什麼? –

+0

沒有錯誤 – altimit

+0

然後...有什麼問題? –

回答

2

參見perlrun, the -i switch for in-place editing

請參閱perlvar, $. line number for the last filehandle accessed

perl -aln -i.bak -F"\t" -e 'print qq(taxid:int:ncbitaxid\tname\tl:label) if $.==1; \ 
          print qq($F[0]\t$F[1]\trank,$F[2])' testing 
+0

您好codnodder感謝您的建議,我只是想知道爲什麼不需要換行符char在'print qq(taxid:int:ncbitaxid \ tname \ tl:label)if $。== 1;' – altimit

+0

@altimit'-l'開關提供自動換行處理。參見[perlrun,-l開關](http://perldoc.perl.org/perlrun.html)。 – codnodder

+0

** - l開關** 啓用自動換行處理。它有兩個單獨的效果。首先,它在與-n或-p一起使用時會自動敲擊$ /(輸入記錄分隔符)。其次,它將$ \(輸出記錄分隔符)賦值爲octnum的值,以便**任何打印語句將該分隔符添加回**。如果省略octnum,則將$ \設置爲當前值$ /。 – altimit

1

使用-i開關in place editing

perl -i -aln -F"\t" -e' 
    print qq(taxid:int:ncbitaxid\tname\tl:label) if $. ==1; 
    print qq($F[0]\t$F[1]\trank,$F[2]) 
' testing 

-i [延伸] 指定由<>構造處理的文件是在就地進行編輯。它通過重命名輸入文件,按原始名稱打開輸出文件並選擇該輸出文件作爲print()語句的默認值來完成此操作。

+0

同意你的'-i'建議,但我認爲'-i'和使用BEGIN塊之間可能存在不正確的相互作用。默認輸出文件句柄尚未指向正在編輯的文件句柄,所以在這種情況下,它只是將標題行打印到STDOUT而不是正在編輯的文件。如果我不正確,請隨時糾正我。 @mpapec – codnodder

+0

@codnodder是的,這是正確的。 –