Replace 使用awk将字符串替换为多行字符串

Replace 使用awk将字符串替换为多行字符串,replace,awk,Replace,Awk,我有两个独立的文件,我希望在file1中搜索并替换一个字符串,以在file2中搜索并替换一整行多个字符串。我一直在努力使用awk,但我不知道如何用一行字符串替换一个字符串。下面是我想做的一个例子 要替换的字符串将匹配要替换它的行的第一个字段(要插入多个字符串以代替单个字符串)。这是一项“查找并替换”任务 文件1: 001 111 112 113 116 117 002 221 222 003 331 004 005 551 555 文件2: 113 114 115 222 223 224 22

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

要替换的字符串将匹配要替换它的行的第一个字段(要插入多个字符串以代替单个字符串)。这是一项“查找并替换”任务

文件1:

001 111 112 113 116 117
002 221 222
003 331
004
005 551 555
文件2:

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
给你:

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
awk'
文件名==“文件2”{
钥匙=1美元
映射[键]=$0
下一个
}
{ 
对于(i=1;i给你:

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
awk'
文件名==“文件2”{
钥匙=1美元
映射[键]=$0
下一个
}
{ 

对于(i=1;i试试这个:

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

awk'NR==FNR{a[$1]=$0;next}{for(i=1;i试试这个:

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

awk'NR==FNR{a[$1]=$0;next}{for(i=1;iawk有一个
next
语句,它的工作原理有点像
else
所以你可以说
condition{foo;next}{bar}
而不必重复地指定第一个条件的否定
condition{foo}!condition{bar}
@EdMorton:是的,我不知道
next
。我也喜欢@JS使用
NR==FNR
,尽管我希望代码对awk新手来说是易读的。@JS的三元运算符(及其上的赋值),以及
1
条件的使用(隐式打印),很难阅读,因此没有太多的指导意义,尽管总体逻辑与我的相同。三元运算符和
1
是习惯用法的awk,具有很强的指导意义。仅
1
就可以教给用户awk的条件/动作语法和默认动作-如果你已经知道,这是显而易见的,如果你不知道然后你需要学习它,这是一个很好的、简单的教学点。我发现有趣的是,你会拒绝生产代码中的三元运算符,它甚至不是一个仅
awk
-的构造,但硬编码文件名没有问题。+1尽管如此。@AdrianFrühwirth:公平点。我选择硬编码文件名,因为它在结构(见我的第一条评论).Awk在这方面做得不好,所以对于生产代码,我会使用另一种语言或将其封装在shell脚本中。尽管如此,让人们阅读清晰的代码还是很好的。让他们想想如何使代码更加紧凑和自我服务。Awk有一个
next
语句,它的工作原理有点像
else
,因此您可以说
condition{foo;next}{bar}
而不必重复地指定第一个条件的否定
condition{foo}!condition{bar}
@EdMorton:是的,我不知道
next
。我也喜欢@JS使用
NR==FNR
,尽管我希望代码对awk新手来说是易读的。@JS的三元运算符(及其上的赋值),以及
1
条件的使用(隐式打印),很难阅读,因此没有太多的指导意义,尽管总体逻辑与我的相同。三元运算符和
1
是习惯用法的awk,具有很强的指导意义。仅
1
就可以教给用户awk的条件/动作语法和默认动作-如果你已经知道,这是显而易见的,如果你不知道然后你需要学习它,这是一个很好的、简单的教学点。我发现有趣的是,你会拒绝生产代码中的三元运算符,它甚至不是一个仅
awk
-的构造,但硬编码文件名没有问题。+1尽管如此。@AdrianFrühwirth:公平点。我选择硬编码文件名,因为它在结构化(见我的第一条评论)。Awk在这方面做得不好,所以对于生产代码,我会使用另一种语言或将其包装在shell脚本中。尽管如此,让人们阅读清晰的代码还是很好的。让他们弄清楚如何使代码更加紧凑和自我服务。