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

.

.

.

私が必要としているのは、ファイル 1 にあるものを正確に出力するファイル 3 です。ただし、列 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を一度に1行ずつ読み取り、3番目の列の値を、行の終わりに表示されるタグに基づいてハッシュまたはディクショナリで見つかった値に置き換えます。


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であるとは主張しません。それは与えられたように機能するようです:

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.

file2

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 に答える
0

完全を期すために、Python3のソリューションを次に示します。

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 に答える