【问题标题】:How to append the text (increasing order) using regex in perl如何在perl中使用正则表达式附加文本(递增顺序)
【发布时间】:2015-03-20 00:09:33
【问题描述】:

我有一个包含以下数据(4 行 4 列)的文件

1   0.126082656 0.118439349 0.129554726 

+1  0.129733599 0.128425124 0.127376228 

+1  0.136149406 0.122109378 0.134386804 

1   0.1077886   0.108754544 0.112025117

现在我需要将 1: 附加到 col2、2: 附加到 col3 3: 附加到 col4 等等直到最后一列,这样数据看起来像

1   1:0.126082656   2:0.118439349   3:0.129554726   

+1  1:0.129733599   2:0.128425124   3:0.127376228

.
.

我尝试过使用以下代码,但我无法进行增量

#!/usr/bin/perl
use strict;
use warnings;
open(my $inp, "<train.train") or die $!;
my @amu = <$inp>;
close ($inp);
foreach my $line(@amu)
{
    if ($line =~ s/(\d+\.\d+)/1:$1/g)
    {
        print $line;
        print "\n";
    }
}

请纠正我以适合所需的解决方案。

【问题讨论】:

  • 正则表达式,如果我需要添加文本(:1:2:3.....)随着列的增加按以下格式1 1:0.126082656 2:0.118439349 3:0.129554726 + 1 1:0.129733599 2:0.128425124 3:0.127376228

标签: regex perl


【解决方案1】:

你可以试试这个替换

$line =~ s/(\d+\.\d+)/\1:1/g

更新答案:

open(my $inp, "< FileName") or die $!;
my $val;
my @amu = <$inp>;
close ($inp);
foreach my $line(@amu)
{
    $val=0;
    if ($line =~ s/(\d+\.\d+)/++$val != 0 ? "$val:$1:1" : ""/eg)
    {
        print $line;
    }
}

输出:

1   1:0.126082656:1 2:0.118439349:1 3:0.129554726:1 
+1  1:0.129733599:1 2:0.128425124:1 3:0.127376228:1 
+1  1:0.136149406:1 2:0.122109378:1 3:0.134386804:1 
1   1:0.1077886:1   2:0.108754544:1 3:0.112025117:1

【讨论】:

  • 感谢您的解决方案。我还有一个查询,如果我需要按照以下格式 1 1 1:0.126082656:1 2:0.118439349 :1 3:0.129554726:1 +1 1:0.129733599:1 2:0.128425124:1 3:0.127376228:1
【解决方案2】:
(?<= )(\S+)

您可以试试这个。替换为\1:1$1:1。查看演示。

https://regex101.com/r/tX2bH4/75

【讨论】:

    【解决方案3】:

    这是一种方法:

    while(<DATA>) {
        my $i = 1;
        s/(\s)(\d)/"$1" . $i++ . ":$2"/eg;
        print;
    }
    
    __DATA__
    1   0.126082656 0.118439349 0.129554726 
    +1  0.129733599 0.128425124 0.127376228 
    +1  0.136149406 0.122109378 0.134386804 
    1   0.1077886   0.108754544 0.112025117
    

    输出:

    1   1:0.126082656 2:0.118439349 3:0.129554726 
    +1  1:0.129733599 2:0.128425124 3:0.127376228 
    +1  1:0.136149406 2:0.122109378 3:0.134386804 
    1   1:0.1077886   2:0.108754544 3:0.112025117
    

    【讨论】:

      【解决方案4】:

      我可能会在没有脚本但在命令行上执行此操作:

      perl -pe "$q=1;s/(\s)(\S)/$1 . $q++ . ':' . $2/ge" your_file.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多