比较2个文件并根据条件打印

时间:2012-07-23 22:41:07

标签: python perl awk

如果这样的问题不断被问到我很抱歉,但我在搜索时找不到。

我有两个文件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(OUTPUT):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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

使用awk的一种方法。保存 fileB 的第一个字段作为哈希的键,其余字段作为其值,并比较 fileA 中的每一行(如果密钥存在),并打印{{1或者哈希的值。

运行下一个命令:

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)

使用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
相关问题