【问题标题】:How to use Sed with spaces inside awk如何在 awk 中使用带有空格的 Sed
【发布时间】:2016-04-27 08:32:56
【问题描述】:

我的问题是: 我有文件 1:

 3119
 3359
 1359
 ...

和文件2

 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' 周围添加 2 个撇号:

sed `cat file1.txt | awk '{print "-e 's/"$1" /"$1" PREFIX./'"}'`<<<"`cat file2.txt`"

但我无法逃脱''!!!

【问题讨论】:

  • 我强烈建议您阅读 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,然后再尝试任何文本操作。

标签: regex bash shell awk sed


【解决方案1】:

这个 awk 命令可以通过将第一个文件中的所有第一列放入一个关联数组中,然后根据 file2 检查它来处理这个问题:

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

2222 abc
3359 PREFIXdef
4444 ghi

【讨论】:

  • 难以置信的简单!! :D
  • 太好了,谢谢!!我可以添加这个以考虑到我的文件中有标签作为分隔符:awk -v OFS='\t' ...
  • 在这种情况下,OFS='\t' 将是获得正确输出的正确方法。
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2019-12-18
  • 2017-09-02
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多