加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

基于文本代码的Awk / Perl / Sed列替换

发布时间:2020-12-13 23:56:18 所属栏目:Linux 来源:网络整理
导读:我有一个包含以下内容的文本文件 L,4m,06/03/2013L,33GJm,06/03/2013,GL,44Bm,BL,4q,08/03/2013J,04/03/2013J,3GU,04/03/2013,GJ,3jm,3GJ,BJ,34Bq,08/03/2013,BM,4v,12/03/2013D,12/03/2013,GD,4B,11/03/2013,BD,13/03/2013,14/03/2013,34Bm,33BUq,3BJUq,44B
我有一个包含以下内容的文本文件

L,4m,06/03/2013
L,33GJm,06/03/2013,G
L,44Bm,B
L,4q,08/03/2013
J,04/03/2013
J,3GU,04/03/2013,G
J,3jm,3GJ,B
J,34Bq,08/03/2013,B
M,4v,12/03/2013
D,12/03/2013,G
D,4B,11/03/2013,B
D,13/03/2013,14/03/2013,34Bm,33BUq,3BJUq,44Bq,3Bq,15/03/2013,3q,15/03/2013
J,34Bjq,33GUm,13/03/2013
J,33GUq,13/03/2013
M,3BU,18/03/2013,19/03/2013,G
M,22/03/2013,34Bv,19/03/2013
L,33BUm,18/03/2013
J,22/03/2013
J,22/03/2013
A,28/03/2013,27/03/2013,25/03/2013,33BUa,26/03/2013,4a,28/03/2013

我想基于以下编码系统翻译第二列.

如果$2以1或2开头 – 将$2更改为Excellent
如果$2包含3BU或3GU – 将$2更改为Good
如果$2包含3BJ或3GJ – 将$2更改为OK
如果$2以4开头 – 将$2更改为差
如果$2以5开头 – 改变$2可怕

我可以使用以下命令找到并将3BU更改为Good

awk 'BEGIN{FS=",";OFS=","} {if ($2~ /3(B|G)U/)print $1,"Good",$3}' file | sponge file

虽然我使用所有其他非3(B | G)U线.我可以使用if else术语虽然这似乎不优雅.我曾尝试使用gensub来解决问题

awk -F,'{gensub(/3(B|G)U/,Good,"",2)}1' file

但这会打印文件内容而不进行替换.任何提示

期望的输出

L,Poor,Ok,G

perl或sed one-liner也很有用,因为这段代码构成了bash shell脚本的一部分

解决方法

$awk '
BEGIN { FS=OFS="," }
$2 ~ /^(1|2)/  { $2 = "Excellent" }
$2 ~ /3(B|G)U/ { $2 = "Good" }
$2 ~ /3(B|G)J/ { $2 = "OK" }
$2 ~ /^4/      { $2 = "Poor" }
$2 ~ /^5/      { $2 = "Terrible" }
1
' foo.txt | head -n 10

L,OK,B

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读