1

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

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 的模式更改字符串,但我无法让它们工作。

4

2 回答 2

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 -   -   -   -   -   -
于 2013-10-30T15:34:22.973 回答
2

该错误来自缺少$打印时$lines[0]

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

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

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

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

然后,您可以$F[0]使用该行的其余部分操作并打印出新值:

perl -wnla -e '$F[0] =~ s/:\D+$//; print join "\t", @F;' testrun
于 2013-10-30T15:24:34.557 回答