AWK:在一个文件中查找一个句子,并将其替换为另一个文件中的句子

时间:2015-11-21 08:25:44

标签: awk

我有两个文件:file1file2

file1

alpha
bravo
charlie  //comment 1
delta
victor   //comment 2
zulu
.
.

file2

kirk
mike  //new comment 1
some  
phil  //new comment 2
.
.
.

如何将file1中的评论1 替换为file2中的新评论1 评论2 新评论2 依此类推

注意:两个文件的注释行数相同。

注2:使用awk。

注3:comment是一个字符串。它可以是任何东西。           例如:charlie // likethis

我做了什么: 我刚刚开始,所以,我试图首先使用具有单一评论的文件来实现它。

awk -F\/\/ '{sub("//.*", "(cat file2 | grep "//")", $0); print $0}' file1

期望输出:

alpha
bravo
charlie  //new comment 1
delta
victor   //new comment 2
zulu
.
.

2 个答案:

答案 0 :(得分:0)

如果匹配不能基于评论的内容,而是基于文件中的评论数量(即第一条评论,第二条评论......),如果只需要替换评论,请尝试此< / p>

awk -F"//" '(NR==FNR && NF>1){a[++i]=$2}
            (NR!=FNR){if(NF>1){print $1 FS a[++j]}
                      else{print $0}}' file2 file1

请注意参数的顺序:file2之前file1 这将提供所需的输出:

alpha
bravo
charlie  //new comment 1
delta
victor   //new comment 2
zulu

更新:这是一个更加防范&#34;防弹&#34;允许在评论中发表评论的版本(例如charlie // comments start with // and are followed by text

awk 'BEGIN{FS=OFS="//"}(NR==FNR && NF>1){$1="";a[++i]=$0}
            (NR!=FNR){if(NF>1){print $1 a[++j]}
                      else{print $0}}' file2 file1

答案 1 :(得分:0)

另一种解决方案:

awk 'NR==FNR{if($2){a[i++]=$2}next}
     $2{$2=a[j++]}1' FS='//' OFS='//' file2 file1

<强>解释

NR==FNR{if($2){a[i++]=$2}next}:如果我们发现包含评论的字段具有值(file2),则此部分将处理if($2),它将存储在数组中{{1} }})保留顺序,a语句用于避免进一步处理的其余

next:当第2个字段(注释)有一个值时,仅处理$2{$2=a[j++]}1 ,将其替换为存储在用于file1的数组,使用相同顺序的file2

最后index,只是帮助您在1中打印所有 file1条记录(由以前的$2=a[j++]修改或不修改)当表达式评估为awk时(在这种情况下为true),默认操作为1受影响的记录。

printFS='//'将分隔符设置为注释标记的值。

<强>结果

OFS='//'