【问题标题】:Replace string in a file with a specific field value from another file with awk用 awk 将文件中的字符串替换为另一个文件中的特定字段值
【发布时间】:2018-01-30 00:19:55
【问题描述】:

我的文件 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 个不同的文件,其名称如下:

输出1:

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

输出2:

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 是唯一的模板文件,其内容不会改变。

【问题讨论】:

    标签: awk replace


    【解决方案1】:

    以下是如何实现使用 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
    

    请注意,如果 STRING_1 等可以包含正则表达式元字符,或者如果替换的元字符可以包含反向引用 (&amp;),或者如果部分匹配是可能的(thethen 中替换),则此方法将出现问题.如果您有许多输出文件并且没有使用 GNU awk,您可能还需要随时关闭()输出文件并使用 &gt;&gt; 写入它们。

    【讨论】:

      【解决方案2】:

      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 指向序号字段编号(即12
      • for (i in f) - 遍历输出文件名

      查看结果:

      $ 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.
      

      【讨论】:

      • @EdMorton,不用它试试,你会看到
      • 不,没关系,我不在乎尝试。
      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 2020-10-08
      • 2018-09-13
      • 2019-03-21
      • 1970-01-01
      • 2012-08-18
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多