在使用Perl one-liner进行编辑时使用开始块

时间:2013-12-18 10:37:01

标签: 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

2 个答案:

答案 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

答案 1 :(得分:1)

使用in place editing-i开关:

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 [延伸]   指定由&lt;&gt;处理的文件构造将被就地编辑。它通过重命名输入文件,按原始名称打开输出文件,并选择该输出文件作为print()语句的默认值来完成此操作。