0

このような質問が続くと申し訳ありませんが、検索中に見つかりませんでした。

2つのファイルAとBがあります。以下に示す形式の違いを含むファイルCを作成する必要があります。

ファイルA:

foo1   2.1  3
foo2   3.1  3
foo3   4.1  3
foo4   2.1  3
foo5   3.1  3

ファイルB:

foo1   2.0  2.9
foo2   2.1  3
foo4   2.1  3

ファイルC(出力):LHSにはファイルAの値が含まれます。RHSにはファイルBの値が含まれます(またはfooが存在しない場合はxxxxのみ)

2.1  3  foo1   2.0  2.9
3.1  3  foo2   2.1  3
4.1  3  foo3   xxxxxxxx
2.1  3  foo4   2.1  3
3.1  3  foo5   xxxxxxxx
4

3 に答える 3

2

2つのファイルを読み取り、ファイルの最初のfcolumn値によってキー設定されたハッシュにデータを格納します。

use strict;
use warnings;

my @files = qw/ FileA.txt  FileB.txt /;
my %data;

for my $i (0, 1) {

  open my $fh, '<', $files[$i] or die qq(Unable to open "$files[$i]": $!);

  while (<$fh>) {
    s/\s+$//;
    my ($key, $val) = split ' ', $_, 2;
    $data{$key}[$i] = $val;
  }
}

for my $key (sort keys %data) {
  printf "%s  %s   %s\n",
      map $_ // 'xxxxxxxx', $data{$key}[0], $key, $data{$key}[1];
}

出力

2.1  3  foo1   2.0  2.9
3.1  3  foo2   2.1  3
4.1  3  foo3   xxxxxxxx
2.1  3  foo4   2.1  3
3.1  3  foo5   xxxxxxxx
于 2012-07-23T23:37:13.220 に答える
1

を使用する1つの方法awkfileBの最初のフィールドをハッシュのキーとして保存し、残りのフィールドをその値として保存し、キーが存在する場合はfileAxxxxxxxxの各行を比較し、ハッシュの値を出力します。

次のコマンドを実行します。

awk '
    BEGIN {
        OFS = "\t";
    }

    FNR == NR {
        b[ $1 ] = $2 "\t" $3;
        next;
    }

    FNR < NR {
        str = ($1 in b) ? b[ $1 ] : "xxxxxxxx";
        print $2, $3, $1, str;
    }
' fileB fileA

次の出力(タブ区切りフィールド):

2.1     3       foo1    2.0     2.9
3.1     3       foo2    2.1     3
4.1     3       foo3    xxxxxxxx
2.1     3       foo4    2.1     3
3.1     3       foo5    xxxxxxxx
于 2012-07-23T23:10:21.477 に答える
1

使用する1つの方法awk

awk 'FNR==NR { array[$1]=$0; next; } { if ($1 in array) print $2, $3, array[$1]; else print $2, $3, $1, "xxxxxxxx"; }' fileB.txt fileA.txt

複数の行に分かれています:

FNR==NR {
    array[$1]=$0
    next
}

{
    if ($1 in array) {
        print $2, $3, array[$1]
    }
    else {
        print $2, $3, $1, "xxxxxxxx"
    }
}

結果:

2.1 3 foo1   2.0  2.9
3.1 3 foo2   2.1  3
4.1 3 foo3 xxxxxxxx
2.1 3 foo4   2.1  3
3.1 3 foo5 xxxxxxxx
于 2012-07-23T23:10:54.870 に答える