首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk gsub问题

awk gsub问题
EN

Ask Ubuntu用户
提问于 2020-04-17 14:59:51
回答 2查看 240关注 0票数 1

我过去曾使用awk进行大型文件操作和substitutions.Recently,我用它来替换带有一组字符的前字母A:

代码语言:javascript
复制
$ awk '{gsub(/A/,"@@@")}1' in.txt >> out.txt

其中in.txt包含各种长度的字母字符串。(AAA、BBB、CCC、AAA等)

稍后编辑:我正在使用一个WSL版本的Ubuntu。另外,我也考虑过sed,但是对于大型文本文件,它不太好用。

如何使用gsub将文件中的所有字符A替换为@@,B替换为###,C替换为%%等

我猜应该是很接近:

代码语言:javascript
复制
$ awk '{gsub(/A|B|C/,"&123")}1' in.txt > out.txt

非常感谢!

稍后编辑:我正在Win10上使用WSL版本的Ubuntu。另外,我也考虑过使用sed,但是它对大型文件不太好用。

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2020-04-17 17:28:08

据我所知,awk的gsub不能做更简单的文本替换。但是,您可以使用match函数的重复应用程序来实现基于哈希的查找,并替换子字符串--类似于:

代码语言:javascript
复制
awk '
  BEGIN{c["A"]="@@@"; c["B"]="###"; c["C"]="%%%"} 
  {
    while(match($0,/[A-C]/)) {
      $0 = substr($0,1,RSTART-1) c[substr($0,RSTART,1)] substr($0,RSTART+1,length($0)-RSTART)
    }
  }
  1
' in.txt

相比之下,perl的s/patt/repl/g (大致相当于awk的gsub)有一个可选的e标志,允许在RHS上对代码进行e排序。所以你可以做这样的事

代码语言:javascript
复制
perl -pe 'BEGIN{%c = (A => "@@@", B => "###", C => "%%%")} $_ =~ s/[A-C]/$c{A6}/ge' in.txt

这很可能更接近你的想法。

票数 0
EN

Ask Ubuntu用户

发布于 2022-02-01 15:18:53

gsub不适用于此任务。到目前为止,最简单的方法是使用tr命令:

代码语言:javascript
复制
cat in.txt | tr 'ABC' '@#%' > out.txt

并检查输出:

代码语言:javascript
复制
cat out.txt
@@@, ###, %%%, @#@#@#
票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1227975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档