如何在awk中使用带空格的Sed

3
我的问题是: 我有一个文件1:
 3119
 3359
 1359
 ...

以及 file2

 2222 abc
 3359 def              <---- this is a match
 4444 ghi
 ...

我希望修改文件1中与文件2相同的索引行,并在字符串前缀添加文本。结果如下:

 2222 abc
 3359 PREFIXdef              <---- this is a match
 4444 ghi
 ...

我想出了这个解决方案:
sed `cat file1.txt | awk '{print "-e s/"$1"/"$1"PREFIX./"}'`<<<"`cat file2.txt`"

这将产生以下结果:
 2222 abc
 3359PREFIX def              <---- this is a match
 4444 ghi
 ...

我该如何在 PREFIX 前添加一个空格并移除后面的空格?我遇到了一个错误(命令未终止)。
理想情况下,我会在 's/xx / xx' 周围添加两个单引号:
sed `cat file1.txt | awk '{print "-e 's/"$1" /"$1" PREFIX./'"}'`<<<"`cat file2.txt`"

但我无法摆脱这个 '' !!!


在尝试进行任何文本操作之前,我强烈推荐您阅读Arnold Robbins所著的《Effective Awk Programming, 4th Edition》这本书。 - Ed Morton
1个回答

6

这个awk命令可以通过将第一个文件中的所有第一列存入关联数组中,然后与file2进行比较来处理该问题:

awk 'FNR==NR{a[$1]; next} $1 in a{$2 = "PREFIX" $2} 1' file1 file2

2222 abc
3359 PREFIXdef
4444 ghi

1
非常简单!!:D - sjsam
太好了,谢谢! 我可以加上这个考虑到我的文件中有制表符作为分隔符: awk -v OFS='\t' ... - user319869
在这种情况下, OFS='\t' 将是获取正确输出的正确方式。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接