通过匹配文本替换下一个文件列值的值列

时间:2014-01-30 19:19:33

标签: linux bash awk

我的问题很简单我有两个文件首先包含值列表和文本,如

  NA   NPH1   0.210000 
  NB   NPH2  -0.146000 
  NC   NPH3   0.179000
  ND   NPH4  -0.130000

,第二个文件格式为

                  column 1      column 2 

   5 O1   139  BCL  ND   NPH4  -0.130000       14.0070           0
   6 O1   139  BCL  C1A  CPAN   0.031000       12.0110           0
   7 O1   139  BCL  CHA  CPM2  -0.163000       12.0110           0
   8 O1   139  BCL  C4D  CPA3  -0.007000       12.0110           0
   9 O1   139  BCL  C1B  CPAN  -0.231000       12.0110           0
  10 O1   139  BCL  CHB  CPMN  -0.317000       12.0110           0

我想通过匹配文件1中的第1列文本来替换第2列值(例如:NA = NA),然后替换第2列中的值。

第二个问题是文件2还有一些其他部分我想复制并在替换后创建一个新文件。

其他部分以  11940!NBOND:债券,我想复制到文件的末尾

1 个答案:

答案 0 :(得分:0)

我认为你想要这个:

File1中:

NA NPH1,0.210000 
NB NPH2,0.146000 
NC NPH3,0.179000
ND NPH4,-0.130000

(为了便于阅读,我正在替换我认为是带有“,”的隐形标签)

文件2:

5 O1 139 BCL,ND NPH4,-0.123456,14.0070,0
6 O1 139 BCL,C1A CPAN,0.031000,12.0110,0
7 O1 139 BCL,CHA CPM2,-0.163000,12.0110,0

输出:

5 O1 139 BCL,ND NPH4,-0.130000,14.0070,0
6 O1 139 BCL,C1A CPAN,0.031000,12.0110,0
7 O1 139 BCL,CHA CPM2,-0.163000,12.0110,0

我会在Perl中做这样的事情:

#!/usr/bin/perl

open(F,"< file1") || die;
while(<F>) {
        chop;
        s/^\s*//;
        @l = split(/,/);
        $subs{$l[0]} = $l[1]
}
close(F);
open(F,"< file2") || die;
while(<F>) {
        s/^\s*//;
        @l = split(/,/);
        if($subs{$l[1]}) {
                $l[2] = $subs{$l[1]};
        }
        print join(',',@l);
}