微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

awk脚本匹配一个模式,然后在分隔符后删除整行

我有一个文件有几行字母数字string,如ZINC123345667_123其次是其他行。 现在,我只需要删除分隔符“_”后面的数字,只在包含“ZINC”的string中其余的行保持不变。 我已经尝试使用下面的awk命令,但只有“ZINC”行而不是其他行。

我的原始数据:

Name: ZINC00000036_1 Grid score: -23.170839 Grid_vdw: -22.304409 Grid_es: -0.866430 Int_energy: 4.932559 @<TRIPOS>MOLECULE ZINC00000036_1 18 18 1 0 0 Name: ZINC00000053_3 Grid score: -23.739523 Grid_vdw: -22.876204 Grid_es: -0.863320 Int_energy: 9.981080 @<TRIPOS>MOLECULE ZINC00000053_3 20 20 1 0 0 Name: ZINC00000351_12 Grid score: -30.763229 Grid_vdw: -27.735493 Grid_es: -3.027738 Int_energy: 4.097543 @<TRIPOS>MOLECULE ZINC00000351_12 31 31 1 0 0

我已经执行了下面的awk脚本

awk -F'_' '/ZINC/ {print $1}' data.file > out.file

获得的产出:

这是在awk中打​​印最快的方法

awk是否并行运行?

Awk:删除行中最后一个空格之后的文本

我怎样才能将我的文件分割成多个文件

将命令行parameter passing给shell脚本中的awk

Name: ZINC00000036 ZINC00000036 Name: ZINC00000053 ZINC00000053 Name: ZINC00000351 ZINC00000351

但是,我还需要输出文件中的其他行如下:

Name: ZINC00000036 Grid score: -23.170839 Grid_vdw: -22.304409 Grid_es: -0.866430 Int_energy: 4.932559 @<TRIPOS>MOLECULE ZINC00000036 18 18 1 0 0 Name: ZINC00000053 Grid score: -23.739523 Grid_vdw: -22.876204 Grid_es: -0.863320 Int_energy: 9.981080 @<TRIPOS>MOLECULE ZINC00000053 20 20 1 0 0 Name: ZINC00000351 Grid score: -30.763229 Grid_vdw: -27.735493 Grid_es: -3.027738 Int_energy: 4.097543 @<TRIPOS>MOLECULE ZINC00000351 31 31 1 0 0

由于我的数据文件非常庞大并且不可能改变,所以我将非常感谢awk的帮助。

在awk的BASH shell中使用bc作为守护进程

Sed | awk在匹配下一行后删除

如何使用awk来testing列值是否在另一个文件中?

如何在search后通过variablesreplace单词?

在linux中基于内容拆分文件

为了只保留包含ZINC行上的第一个下划线字符_之前的部分,并使其他行保持机动,可以这样做:

awk -F'_' '/ZINC/{print $1;next}1' file

sed '/ZINC/s/_.*//' file awk '/ZINC/{sub(/_.*/,"")}1' file

我会用sed解决这个问题:

sed -E '/ZINC[0-9]+_/s/_.*//' yourfile

这就是说…在任何包含“ZINC”后跟一些数字然后是下划线的行上,替换(即替换)下划线和行中的任何内容都不会在文件中出现。

如果在sed命令之后添加-i ,则可以在不需要创建第二个文件的情况下进行就地编辑。

我不认为awk是这个工作的正确工具。 一个简单的sed命令将做到这一点:

sed 's/(ZINC[0-9]{1,})_[0-9]{1,}/1/' file # most portable sed 's/(ZINC[0-9]+)_[0-9]+/1/' file # GNU sed sed -E 's/(ZINC[0-9]+)_[0-9]+/1/' file # extended regex mode

在下划线(ZINC,后跟一些数字)之前捕捉零件,并丢弃其余部分。

在Perl中同样的东西,由于数字字符类d :

perl -pe 's/(ZINCd+)_d+/$1/' file

想想看,如果你决心使用awk,这将工作:

awk -F_ '/ZINC/{$0=$1}1' file

当ZINC匹配时,用第一个字段的内容覆盖该行。 1最后确保每行都被打印出来。

另一种使用sed格式的答案,

sed 's/(ZINC[0-9]*)(_.*)/1/g' inputfile

用整个模式的前半部分替换整个字符串。 休息所有其他线路将被显示

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐