0

这是我想要实现的目标:

文件 1 的内容如下:

.

.

.

get_time file 10 -max 5 -min 0 abcde

get_time file 9 -max 5 -min 0 abfdf

get_time file 9 -max 5 -avg 3 -min 0 xyyxx

get_time file 10 -max 5 -min 0 abcxx

.

.

.

同时文件 2 只包含:

abcde 8

abfdf 8.5

xyyxx 7.5

abcxx 9

.

.

.

我需要的是一个文件 3,它准确地打印出文件 1 中的内容,除了相应地替换第 3 列中的值。

所以输出应该是这样的:

.

.

.

get_time file 8 -max 5 -min 0 abcde

get_time file 8.5 -max 5 -min 0 abfdf

get_time file 7.5 -max 5 -avg 3 -min 0 xyyxx

get_time file 9 -max 5 -min 0 abcxx

.

.

.

注意:文件 1 包含许多其他内容,其前后不以“get_time”开头。在上面的示例中,它们被标记为点。

谢谢你的帮助!

编辑:谢谢!快速跟进。另一个类似的文件有这样的东西:

get_time file123 tmp 10 -max 5 -min 0 abcde 

get_time file foo 9 -max 5 -min 0 abfdf 

get_time file43 bar 9 -max 5 -avg 3 -min 0 xyyxx 

你会如何修改你的脚本?再次感谢

4

3 回答 3

1

将文件 2 读入散列或字典,其中键是 5 个字母的标签。

一次读取文件 1 一行,将第三列中的值替换为根据行尾出现的标记在散列或字典中找到的值。


Perl

#!/usr/bin/env perl
use strict;
use warnings;
use English qw( -no_match_vars );

my %times;

$OFS = " ";

open my $file, "<", "file2" or die "Failed to open file2 ($!)";
while (<$file>)
{
    my($key,$value) = split;
    $times{$key} = $value;
}
close $file;

while (<>)
{
    if (/^get_time file/)
    {
        my(@words) = split;
        my($keycol) = $words[$#words];
        $words[2] = $times{$keycol} if defined $times{$keycol};
        print @words, "\n";
        next;
    }
    print;
}

我没有声称它是最高级的 Perl。考虑到它似乎确实有效:

文件 1

.X1X.
.X2X.
.X3X.
get_time file 10 -max 5 -min 0 abcde
get_time file 9 -max 5 -min 0 abfdf
get_time file 9 -max 5 -avg 3 -min 0 xyyxx
get_time file 10 -max 5 -min 0 abcxx
.X4X.
.X5X.
.X6X.

文件2

abcde 8
abfdf 8.5
xyyxx 7.5
abcxx 9

输出

.X1X.
.X2X.
.X3X.
get_time file 8 -max 5 -min 0 abcde 
get_time file 8.5 -max 5 -min 0 abfdf 
get_time file 7.5 -max 5 -avg 3 -min 0 xyyxx 
get_time file 9 -max 5 -min 0 abcxx 
.X4X.
.X5X.
.X6X.
于 2012-07-19T16:13:07.833 回答
1

我想我会发布一个最高级的 Perl解决方案。;-)

#!/usr/bin/perl
use strict;
use warnings;
use Inline::Files;

my %data = map split, <FILE2>;

while (<FILE1>) {
    if (my ($key) = /^get_time file .+ (\w+)$/) {
        s/\d+/$data{$key}/ if exists $data{$key};
    }
    print;
}

__FILE2__
abcde 8
abfdf 8.5
xyyxx 7.5
abcxx 9
__FILE1__
.X1X.
.X2X.
.X3X.
get_time file 10 -max 5 -min 0 abcde
get_time file 9 -max 5 -min 0 abfdf
get_time file 9 -max 5 -avg 3 -min 0 xyyxx
get_time file 10 -max 5 -min 0 abcxx
.X4X.
.X5X.
.X6X.

结果与乔纳森的解决方案相同。

更新: user1497417 询问如何解析一些与他在第一篇文章中想要更改的格式不同的格式。这 3 行是:

get_time file123 tmp 10 -max 5 -min 0 abcde
get_time file foo 9 -max 5 -min 0 abfdf
get_time file43 bar 9 -max 5 -avg 3 -min 0 xyyxx 

如果这些行中的任何一行需要执行替换,则脚本必须知道如何找到需要替换(或不替换)的数字。也许将替换行更改为:

s/\d+(?= -max)/$data{$key}/ if exists $data{$key};

这仍然没有考虑分数,但海报没有说明它们是否发生,如果是,是否也应该更换它们。所以,我暂时先不管它

于 2012-07-19T17:06:48.090 回答
0

为了完整起见,这里有一个 Python 3 中的解决方案:

with open("file2") as f:
    times = dict(line.split() for line in f)

with open("file1") as in_f, open("file3", "w") as out_f:
    for line in in_f:
        fields = line.split(" ")
        if fields[0] == "get_time":
            fields[2] = times.get(fields[7], fields[2])
            line = " ".join(fields)

        out_f.write(line)
于 2012-07-19T19:01:09.737 回答