2013-10-30 53 views
0

我有一个看起来像一个文件:命令行的Perl:分割字符串修改第一部分

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 

我试图通过分割字符串做蟒蛇的方式,改变的预防部分,然后将其添加到行并打印行。我该怎么做呢?

这里(的许多事情之一),所以到目前为止,我曾尝试:从线

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

,并使阵列,然后拿到第一项(也就是,我一直没能捕捉到的部分我倒是希望尚未修改。)

问题是,这将返回

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

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

回答

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