linux - awk 脚本匹配模式,然后删除分隔符后的整行

标签 linux awk sed

我有一个文件,其中有几行包含字母数字字符串,例如 ZINC123345667_123,后跟其他行。现在,我需要仅删除字符串包含“ZINC”的行中分隔符“_”后面的数字,其余其他行保持不变。我尝试使用下面的 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

获得的输出:

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 的帮助。

最佳答案

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

关于linux - awk 脚本匹配模式,然后删除分隔符后的整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222613/

相关文章:

linux - 屏蔽分隔列的shellscript

regex - 发出运行 sed 以替换文件中的字符串

bash - 如何使用 sed 在文件中的每一行之前插入一行,原始行的内容被一个字符串包围?

python - 如何让 python 窗口以 "Always On Top"运行?

java - 如何阻止 cron 作业创建 attach_pid 文件?

bash - 用 awk 或 sed 替换和递增字母和数字

bash - 如何重复包含标记段的所有行,以便在 BASH 中的每一行上只显示一个段标记?

bash - 用 sed + bash 函数替换

c - Pthreads - 高内存使用率

svn - unix 命令 svn log 仅获取文件信息