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

时间:2018-01-29 15:23:33

标签: awk replace

我的文件1看起来像:

bla bla bla STRING_1 blabla STRING_2.
bla bla bla bla bla.

我的文件2看起来像(以标签分隔):

FILENAME   FIELD_1   FIELD_2
out1   ABCDEF   GHIJKL
out2   MNOPQR   STUVWX

我正在尝试将file1中的STRING_1STRING_2替换为file2中的相应字段,并输出2个不同的文件,其名称如下所示:

OUT1:

bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.

OUT2:

bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.

我尝试了什么:

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

此命令仅创建包含以下内容的文件“FILENAME”:

bla bla bla FIELD_1 blabla FIELD_2.
bla bla bla bla bla.

任何帮助将不胜感激。 谢谢!

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

2 个答案:

答案 0 :(得分:1)

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

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

请注意,如果STRING_1等可以包含regexp元字符,或者替换的可以包含反向引用(&),或者如果可以进行部分匹配(the替换,则此方法会出现问题then)。您可能还需要在出发时关闭()输出文件,如果您有许多输出文件并且没有使用GNU awk,请使用>>写入它们。

答案 1 :(得分:0)

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}}和1
  • 2 - 迭代输出文件名

查看结果:

for (i in f)