awk - 在 bash 中使用正则表达式进行就地解析
问题描述
我想解析第 4 列中的字符串,并在删除不需要的字符时重写同一列中的结果。
我有一个如下所示的文本文件:
Y 12914512 12914512 C/0.214286 A
Y 12914721 12914721 C/0.642857 T
Y 13355944 13355944 A/0.642857 G
Y 13414871 13414871 C/0.642857 T
Y 13470103 13470103 G/0.214286 A
Y 13479657 13479657 G/0.642857 C
Y 14824110 14824110 T/0.933333 *
Y 14824111 14824111 A/0.933333 *
Y 14840785 14840785 C/0.690476 T
Y 14840887 14840887 C/0.933333 T
Y 19705901 19705901 A/0.272727 G
Y 19731995 19731995 A/0.928571 C
Y 19735493 19735493 T/0.928571 C
Y 20587967 20587967 A/0.642857 C
Y 20756691 20756691 C/0.642857 T
Y 21904151 21904151 G/0.9375 A
我想删除第四列中“/”之后的所有尾随字符,并将其替换为第五列中的值,因此我修改后的文本如下所示:
Y 12840422 12840422 G/A
Y 12914512 12914512 C/A
Y 12914721 12914721 C/T
Y 13355944 13355944 A/G
我想出了下面的代码,但它没有产生我期望的结果:
awk -F ":" '{print $1"/"$2}' myTEXT.txt | sed 's/\([^/]*\)\{4\}$//'
解决方案
另一个(打高尔夫球)awk
$ awk '{k=$NF;sub("/.*","/"k)}1' file
Y 12914512 12914512 C/A
Y 12914721 12914721 C/T
Y 13355944 13355944 A/G
Y 13414871 13414871 C/T
Y 13470103 13470103 G/A
Y 13479657 13479657 G/C
Y 14824110 14824110 T/*
Y 14824111 14824111 A/*
Y 14840785 14840785 C/T
Y 14840887 14840887 C/T
Y 19705901 19705901 A/G
Y 19731995 19731995 A/C
Y 19735493 19735493 T/C
Y 20587967 20587967 A/C
Y 20756691 20756691 C/T
Y 21904151 21904151 G/A
可能更容易sed
$ sed -E 's /.*(.) /\1 ' file
推荐阅读
- ruby-on-rails - 如何向我的引擎添加自定义 rake 任务?
- r - 自动记录数据和新列
- r - 多个T检验的功能,以找到主效应
- r - 嵌套列表的列均值
- sql - 此 sql 命令中缺少什么表达式?
- java - 有没有办法使用 cdk 创建没有 CA(多帐户注册)的证书?
- javascript - 平面列表未显示每个对象元素
- c# - 如何在 ListView x:name 内的 Views 中访问 x:name?是否可以设置不同形式的用户输入?
- google-apps-script - 如何从 Google Apps 脚本的最后一行提取值
- react-native - 我可以将我的广告横幅固定在底部导航旁边的屏幕底部吗?