为了账号安全,请及时绑定邮箱和手机立即绑定

查找和替换特定列中的破折号

查找和替换特定列中的破折号

牧羊人nacy 2021-03-22 17:14:09
我有一个包含五列的文件。文件1看起来像:1111    1111    exm-IND1-200449980  I   I1111    1111    exm-IND1-201453487  I   -1111    1111    exm-IND1-85310248   I   I1111    1111    exm-IND10-102817747 D   D1111    1111    exm-IND10-18329639  -   D1111    1111    exm-IND10-27476467  I   I1111    1111    exm-IND10-27727540  D   -我只想删除第-4列和第5列,并在这些情况下替换-为0。我一直在使用以下代码行:sed '/^\([^\t]*\t[^\t]*\t[^\t]*\)\t-\t-\(.*\)/ s//\1\t0\t\2/' file1 > newfile解决问题,但感觉这有些笨拙。有没有人对此问题有更简洁的建议?因为我会遇到很多。预先感谢您的帮助。
查看完整描述

4 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

Awk是一个更好的选择:

awk '{sub("-","0",$4); sub("-","0",$5); print}'


查看完整回答
反对 回复 2021-03-31
?
千万里不及你

TA贡献1784条经验 获得超9个赞

GNU sed

sed -r ':k;s/-(\s*\S*)$/0\1/g;tk' file

..输出:


1111 1111 exm-IND1-200449980 II

1111 1111 exm-IND1-201453487我0

1111 1111 exm-IND1-85310248 II

1111 1111 exm-IND10-102817747 DD

1111 1111 exm-IND10-18329639 0 D

1111 1111 exm-IND10-27476467 II

1111 1111 exm-IND10-27727540 D 0


查看完整回答
反对 回复 2021-03-31
?
炎炎设计

TA贡献1808条经验 获得超4个赞

这就是你想要的:


$ awk '$4=="-"{$4=0}$5=="-"{$5=0}{$1=$1}1' OFS='\t'  file

1111    1111    exm-IND1-200449980      I       I


1111    1111    exm-IND1-201453487      I       0


1111    1111    exm-IND1-85310248       I       I


1111    1111    exm-IND10-102817747     D       D


1111    1111    exm-IND10-18329639      0       D


1111    1111    exm-IND10-27476467      I       I


1111    1111    exm-IND10-27727540      D       0


查看完整回答
反对 回复 2021-03-31
  • 4 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信