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の方法でそれを実行しようとしています。どうすればいいですか?

これが(多くのことの1つ)私がこれまでに試したことです:

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

行から配列を作成し、最初のエントリを取得します (つまり、変更したい部分をまだキャプチャできていません)。

問題は、これが返されることです

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

Ps。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

このエラーは、$when printingが欠落しているために発生します$lines[0]

さらに、split $_is と同等で、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 に答える