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

标签 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:

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);
}

关于linux - 通过匹配文本替换下一个文件列值中的值列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21465576/

相关文章:

bash - 您可以为从文件中提取的特定行着色吗?

javascript - 无法使用 MulterJS 在 Linux 服务器上上传文件

linux - 为什么 repoquery 输出错误的文件列表?

Linux 历史详细信息

linux - 可以让 awk 使用 `exit 2` 退出 bash 脚本吗?

bash - 如何将存储值作为列号参数传递以在 awk 中进行编辑?

linux - 使用 awk 的 ~ 运算符

linux - rm 向变量添加额外的反斜杠

mysqlimport,是否可以从单独的节点同时导入CSV数据

linux - 将txt行放入变量中,除以分隔符检查并重写txt发送命令