0

如果一直有人问这种问题,我很抱歉,但我在搜索时找不到。

我有两个文件 A 和 B。我需要创建一个文件 C,其中包含如下所示格式的差异:

档案一:

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

通读这两个文件并将数据存储在由文件的第一个 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

一种使用方式awk将fileB的第一个字段保存为哈希的键,将其余字段保存为其值,如果键存在,则比较fileA中的每一行,并打印xxxxxxxx或哈希的值。

运行下一个命令:

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

一种使用方式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 回答