替换File1中的模式,并用File2中相应的匹配模式+列替换


1

我研究了许多类似的问答,但仍然停留在解决方案上。

我有2个档案。

文件1

cow
aaaaa
brown
bbbbb
often
ccccc
farts
ddddd

文件2

在File2中,以“ space”作为分隔符,然后输入col 1 =“ brown”和col2 =“ 149,456,foo”。另外,File1和File2的顺序不同(排序在这里不起作用,我想依靠匹配的键进行替换)。

brown 149,456,foo
cow 192,231,bar
farts 81,2007,tip
often 427,541,top

我想创建File3

cow 192,231,bar
aaaaa
brown 149,456,foo
bbbbb
often 427,541,top
ccccc
farts 81,2007,tip
ddddd

换句话说,记下column1-in-File2(棕色)并在File1中搜索它。在File1中找到该匹配项后,请将匹配项替换为相应File2的整行(棕色149,456,foo)。

我已经试过了:

$ awk 'NR==FNR{a[NR]=$0;next}{$6=a[FNR]}1' file2 file1

但是结果似乎占用了每个row1,然后将其与其他文件中的row1一起打印,不涉及匹配/替换。

brown     brown 149,456,foo
aaaa     cow 192,231,bar
cow     farts 81,2007,tip
bbbbb     often 427,541,top
farts     
ccccc     
often     
ddddd 

我想使用awk或sed。提前非常感谢您的任何建议!

Answers:


3

尝试:

$ awk 'FNR==NR{a[$1]=OFS $2;next} {print $0 a[$1]}' file2 file1
cow 192,231,bar
aaaaa
brown 149,456,foo
bbbbb
often 427,541,top
ccccc
farts 81,2007,tip
ddddd

这个怎么运作

  1. FNR==NR{a[$1]=OFS $2;next}

    在读取file2(命令行中的第一个文件)时,我们a在第一个字段的键下将一个条目添加到关联数组$1。该条目包含输出字段分隔符OFS,后跟第二个字段$2。然后,我们跳过其余的命令,并跳转到该next行的开头。

  2. 打印 $0 a[$1]

    在读取file1(命令行上的第二个文件)时,我们打印每一行,然后打印该行的数组值a


为什么不只存储$2然后print $0, a[$1]呢?那不是更简单清楚吗?
通配符

1
@Wildcard是的,但即使为空也要print $0, a[$1]放置一个空格。如果是我的项目,我可能不会在意多余的尾随空间,并且会按照您的建议使用代码。包括SE网站上的许多人在内的其他人有时会痴迷于此类空间。因此,在SE上,我通常会尽量避免使用它们。$0a[$1]
John1024 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.