命令行perl:拆分字符串以修改第一部分

时间:2013-10-30 15:18:57

标签: perl command-line

我有一个看起来像的文件:

SNP Al1 Al2 Freq1   MAF AvgCall Rsq Genotyped   LooRsq  EmpR    EmpRsq  Dose1   Dose2
20:60479    C   C   1.00000 0.00000 1.00000 0.00000 -   -   -   -   -   -
20:60522:T_TC   R   R   1.00000 0.00000 1.00000 0.00000 -   -   -   -   -   -
20:60571    C   C   1.00000 0.00000 1.00000 0.00000 -   -   -   -   -   -
20:60795    G   C   0.99627 0.00373 0.99627 0.02668 -   -   -   -   -   -
....

我想更改看起来像

的条目
20:60522:T_TC    R      R    1.00000

采用与其余行相同的格式,即

20:60522    R   R    1.00000

我试图通过拆分字符串,更改有问题的部分,然后将其添加到行并打印行来以python的方式进行。我该怎么做?

到目前为止,这是我尝试过的很多事情之一:

perl -wnl -e '@lines = split $_; print lines[0]' testrun

从行创建数组,然后获取第一个条目(也就是说,我还无法捕获我想要修改的部分。)

问题是这会返回

print() on unopened filehandle lines at -e line 1, <> line 1. etc

聚苯乙烯。将放弃任何解决我的问题的解决方案。我知道有些解决方案可以使用类似sed的模式更改字符串,但我无法让它们工作。

2 个答案:

答案 0 :(得分:4)

这将用冒号替换冒号后跟字母和下划线:

perl -wpe 's/:[a-zA-z_]+/ /' testrun

这是我的输出:

SNP Al1 Al2 Freq1   MAF AvgCall Rsq Genotyped   LooRsq  EmpR    EmpRsq  Dose1   Dose2
20:60479    C   C   1.00000 0.00000 1.00000 0.00000 -   -   -   -   -   -
20:60522    R   R   1.00000 0.00000 1.00000 0.00000 -   -   -   -   -   -
20:60571    C   C   1.00000 0.00000 1.00000 0.00000 -   -   -   -   -   -
20:60795    G   C   0.99627 0.00373 0.99627 0.02668 -   -   -   -   -   -

答案 1 :(得分:2)

错误来自于打印$时遗失$lines[0]

此外,split $_相当于split $_, $_,它不会给你任何东西。相反,允许split采用默认参数(相当于split ' ', $_):

perl -wnl -e '@lines = split; print $lines[0]' testrun

您还可以利用-a flag自动将每一行拆分为数组@F

perl -wnla -e 'print $F[0]' testrun

然后你可以操纵$F[0]并用剩下的行打印出新值:

perl -wnla -e '$F[0] =~ s/:\D+$//; print join "\t", @F;' testrun
相关问题