我有一个文件有几行字母数字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是否并行运行?
将命令行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在匹配下一行后删除行
如何在search后通过variablesreplace单词?
为了只保留包含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] 举报,一经查实,本站将立刻删除。