使用awk用多字符串行替换字符串

时间:2014-05-04 00:15:44

标签: replace awk

我有两个单独的文件,我希望在file1中搜索并替换file2中的多个字符串的整行。我一直在使用awk,但我不知道如何替换一串字符串的字符串。以下是我要做的事情的一个例子。

要替换的字符串将匹配该行的第一个字段以替换它(要插入的多个字符串代替单个字符串)。它是一个"发现和替换"任务。

文件1:

001 111 112 113 116 117
002 221 222
003 331
004
005 551 555

file2的:

113 114 115
222 223 224 225 226 227
551 552 553 554

期望的输出:

001 111 112 113 114 115 116 117
002 221 222 223 224 225 226 227
003 331
004
005 551 552 553 554 555

2 个答案:

答案 0 :(得分:3)

试试这个:

awk 'NR==FNR{a[$1]=$0;next}{for(i=1;i<=NF;i++)$i=($i in a?a[$i]:$i)}1' file2 file1
001 111 112 113 114 115 116 117
002 221 222 223 224 225 226 227
003 331
004
005 551 552 553 554 555
  • 我们先读取file2并创建一个以column1为索引的数组,其中包含整行作为值。
  • 对于file1,我们遍历每个元素,如果在我们的数组中找到它,我们用它替换它。

答案 1 :(得分:2)

你走了:

awk '
  FILENAME == "file2" {
    key = $1
    map[key] = $0
    next
  }
  { 
    for (i = 1; i <= NF; i++) {
      if (map[$i])
        $i = map[$i]
    }
    print
  }
' file2 file1
001 111 112 113 114 115 116 117
002 221 222 223 224 225 226 227
003 331
004
005 551 552 553 554 555

这将从file2中获取行,并用整行填充一个名为map的数组,键入第一个元素(我将awk&#39; s关联数组系统更像哈希)。否则,循环遍历每个元素并替换具有map值的元素,然后打印输出。请注意,必须首先提供file2才能运行,以便可以填充map数组。