Linux Awk脚本以匹配模式,然后删除分隔符后的整行

Linux Awk脚本以匹配模式,然后删除分隔符后的整行,linux,awk,sed,Linux,Awk,Sed,我有一个文件,它有几行字母数字字符串,比如ZINC123345667_123,后面跟着其他行。现在,我只需要删除包含“zing”的字符串的行中分隔符“u”后的数字,其余行保持不变。我尝试使用下面的awk命令,但只获得了带有“zing”的行,而没有获得其他行 我的原始数据: Name: ZINC00000036_1 Grid Score: -23.170839 Grid_vdw: -22.304409 Grid_es: -0

我有一个文件,它有几行字母数字字符串,比如ZINC123345667_123,后面跟着其他行。现在,我只需要删除包含“zing”的字符串的行中分隔符“u”后的数字,其余行保持不变。我尝试使用下面的awk命令,但只获得了带有“zing”的行,而没有获得其他行

我的原始数据:

 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
获得的产出:

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
名称:ZINC0000036
网格分数:-23.170839
电网vdw:-22.304409
电网参数:-0.866430
国际能源:4.932559
@分子ZINC000003618100
姓名:ZINC0000053
网格分数:-23.739523
电网vdw:-22.876204
电网参数:-0.863320
国际能源:9.981080
@分子ZINC000053200100
姓名:ZINC0000351
网格分数:-30.763229
电网vdw:-27.735493
电网设备:-3.027738
国际能源:4.097543
@分子ZINC0000351 31 1 0 0 0

由于我的数据文件很大,无法进行转换,我将非常感谢您对awk的帮助。

要在包含锌的行上仅保留第一个下划线字符
\uu
之前的部分,并保留其他行,您可以执行以下操作:

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

我会用
sed
解决这个问题:

sed -E '/ZINC[0-9]+_/s/_.*//' yourfile
那就是说。。。在任何包含“ZINK”(锌)和一些数字,然后是下划线的行上,将下划线和行上的任何其他内容替换为
yourfile


如果在
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
捕获下划线前的部分(锌,后跟一些数字),并丢弃其余部分

在Perl中也是如此,由于数字字符类
\d
,它稍微短了一些:

perl -pe 's/(ZINC\d+)_\d+/$1/' file
想一想,如果您决定使用awk,这将起作用:

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

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

使用sed的另一种回答格式

sed '/ZINC/s/_.*//' file
awk '/ZINC/{sub(/_.*/,"")}1' file
sed 's/\(ZINC[0-9]*\)\(_.*\)/\1/g' inputfile

用模式的前半部分替换整个字符串。将显示其余所有行

谢谢大家的帮助。所有脚本都适用于我的查询。
sed 's/\(ZINC[0-9]*\)\(_.*\)/\1/g' inputfile