Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过匹配文本替换下一个文件列值中的值列_Linux_Bash_Awk - Fatal编程技术网

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

Linux 通过匹配文本替换下一个文件列值中的值列,linux,bash,awk,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

我的问题很简单,我有两个文件,第一个是值列表,第二个是文本

  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:bonds和我想复制到文件末尾

我想你想要这个:

文件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);
}
#/usr/bin/perl
开放式(F,“
很高兴你的问题很简单。我不想问这里的人一些复杂的问题。我有数千行的列,很难用逗号添加或删除。请给出一个阅读这些空间的建议。这样我就不会弄乱文件顺序对不起,我认为您理解错误了,NB应该与文件2的NB匹配,然后替换值。我想你对这个问题理解错了。您的代码只是替换列文本,它与文本不匹配并替换它