我有两个文件:file1
和file2
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
.
.
答案 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
受影响的记录。
print
和FS='//'
将分隔符设置为注释标记的值。
<强>结果
OFS='//'