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