将制表符后面的数字匹配为单行



我想知道如何提取ID (KC000001-3)之后的所有数字,包括使用Perl regex点击后设置的数字。

第一个ID的额外数字(0.50),第二个ID的额外数字(0.60),第三个ID的额外数字(0.70 0.80)总是以空格作为新行开始,并以另一次点击结束。

输入文件.

KC000001    0.30    0.40    0.50
KC000002    0.30    0.40    0.50    0.60
KC152363    0.30    0.40    0.50    0.60    0.70    0.80

我想要得到这个输出文件。

0.30    0.40    0.50
0.30    0.40    0.50    0.60
0.30    0.40    0.50    0.60    0.70    0.80

我已经准备了这个正则表达式。

if ($linea =~ /^(.[a-z0-9]d+.d)s(.?)$/){
print $line 
}

然而,它给了我以下错误(它没有在制表符后面打印数字(第一个为0.50),第二个为0.60,第三个为0.70 0.80))

0.30    0.40
0.30    0.40    0.50
0.30    0.40    0.50    0.60

我想知道这个正则表达式有什么问题。有可能只使用正则表达式吗?

输入文件.

KC000001    0.30    0.40    0.50
KC000002    0.30    0.40    0.50    0.60
KC152363    0.30    0.40    0.50    0.60    0.70    0.80

输出文件

0.30    0.40
0.30    0.40    0.50
0.30    0.40    0.50    0.60

使用Perl一行代码:

$ perl -F"t" -nE 'say join "t", @F[1..$#F]' file | tee output_file
0.30    0.40    0.50
0.30    0.40    0.50    0.60
0.30    0.40    0.50    0.60    0.70    0.80

这是一个数组切片操作,只保留第2列直到最后的

这将删除每行的第一个制表符之前的所有内容:

$line =~ s/^[^t]*t//;
print $line;

作为一行代码:

perl -pe's/^[^t]*t//'

参见指定文件处理到Perl一行程序。

使用下面的Perl一行代码:

perl -pe 's{^KCw+t}{}' infile > outfile

或者就地修改文件:

perl -i.bak -pe 's{^KCw+t}{}' infile

Perl单行程序使用这些命令行标志:
-e:告诉Perl查找内联代码,而不是在文件中查找。
-p:每次循环输入一行,默认赋值给$_。每次循环迭代后加入print $_
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在原始文件的名称后面附加扩展名.bak来保存原始文件的备份副本。如果您不想写入备份文件,只需使用-i并跳过扩展名。

参见:

  • perldoc perlrun:如何执行Perl解释器:命令行开关
  • perldoc perlre: Perl正则表达式
  • perldoc perlrequick: Perl正则表达式快速入门

最新更新