Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
将文件中的字符串替换为另一个具有awk的文件中的特定字段值_Awk_Replace - Fatal编程技术网

将文件中的字符串替换为另一个具有awk的文件中的特定字段值

将文件中的字符串替换为另一个具有awk的文件中的特定字段值,awk,replace,Awk,Replace,我的文件1看起来像: bla bla bla STRING_1 blabla STRING_2. bla bla bla bla bla. 我的文件2看起来像(选项卡分隔): 我试图用文件2中相应的字段替换文件1中的STRING_1和STRING_2,并输出两个不同的文件,其名称如下: 输出1: 输出2: 我尝试的是: awk -F '\t' ' NR==FNR{ if(NR>1){ a[NR]=$1 b[NR]=$2 c[NR]=$3

我的文件1看起来像:

bla bla bla STRING_1 blabla STRING_2.
bla bla bla bla bla.
我的文件2看起来像(选项卡分隔):

我试图用文件2中相应的字段替换文件1中的
STRING_1
STRING_2
,并输出两个不同的文件,其名称如下:

输出1:

输出2:

我尝试的是:

awk -F '\t' '
NR==FNR{
   if(NR>1){
      a[NR]=$1
      b[NR]=$2
      c[NR]=$3
      next
   }
}
{
   for(i=1; i<=FNR; i++){
      gsub(/STRING_1/,bi])
      gsub(/STRING_2/,c[i])
      print $0 > a[i]
   }
}
' file2.tab file1.tab
任何帮助都将不胜感激。 谢谢


注意:file1是唯一的模板文件,其内容不会更改

以下是如何实现使用未经测试的gsub()s的方法:

awk '
NR==FNR {
    if (NR>1) {
        files[$1]
        for (i=2; i<=NF; i++) {
            map[$1,i-1] = $i
        }
    }
    next
}
{
    for (file in files) {
        rec = $0
        gsub(/STRING_1/,map[file,1],rec)
        gsub(/STRING_2/,map[file,2],rec)
        print rec > file
    }
}
' file2 file2
awk'
NR==FNR{
如果(NR>1){
档案[$1]
对于(i=2;i文件
}
}
'文件2文件2

请注意,如果字符串_1等可以包含regexp元字符,或者替换的元字符可以包含反向引用(
&
),或者如果可以进行部分匹配(
中替换的
,然后
),则此方法将出现问题。您可能还需要关闭()如果您有许多输出文件,并且没有使用GNU awk,则在运行过程中使用
>
写入输出文件。

GNU
awk
解决方案:

awk 'NR==FNR{ 
         if (NR==1) next;
         c=0; f[$1][++c]=$2; f[$1][++c]=$3; next 
     }
     { 
         c=0;
         for (i in f) { 
             b[++c]=$0; 
             gsub(/STRING_1/, f[i][1], b[c]); 
             gsub(/STRING_2/, f[i][2], b[c]); 
             print b[c] > i 
         }
     }' file2 file1
  • f[$1][++c]
    -多维数组
    f
    ,其中
    $1
    是父键(例如
    out1
    ),并且
    ++c
    指向有序字段编号(即
    1
    2
  • 用于(f中的i)
    -迭代输出文件名
查看结果:

$ head out[12]
==> out1 <==
bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.

==> out2 <==
bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.
$head out[12]

==>out1out2@EdMorton,不用它试一下,你会发现不,没关系,我不想试一下。
bla bla bla FIELD_1 blabla FIELD_2.
bla bla bla bla bla.
awk '
NR==FNR {
    if (NR>1) {
        files[$1]
        for (i=2; i<=NF; i++) {
            map[$1,i-1] = $i
        }
    }
    next
}
{
    for (file in files) {
        rec = $0
        gsub(/STRING_1/,map[file,1],rec)
        gsub(/STRING_2/,map[file,2],rec)
        print rec > file
    }
}
' file2 file2
awk 'NR==FNR{ 
         if (NR==1) next;
         c=0; f[$1][++c]=$2; f[$1][++c]=$3; next 
     }
     { 
         c=0;
         for (i in f) { 
             b[++c]=$0; 
             gsub(/STRING_1/, f[i][1], b[c]); 
             gsub(/STRING_2/, f[i][2], b[c]); 
             print b[c] > i 
         }
     }' file2 file1
$ head out[12]
==> out1 <==
bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.

==> out2 <==
bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.