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

时间:2014-08-09 20:14:51

标签: 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的任何帮助。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我会用sed解决这个问题:

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

在任何包含&#34; ZINC&#34;接下来是一些数字然后是下划线,替换(即替换)下划线和线上的任何其他内容yourfile中没有任何内容。

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

答案 2 :(得分:1)

我不认为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/(ZINC\d+)_\d+/$1/' file

想想看,如果你决定使用awk,这会有效:

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

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

答案 3 :(得分:0)

要仅保留包含_的第一个下划线字符ZINC之前的部分,并保留其他行,请执行以下操作:

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

答案 4 :(得分:0)

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

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

用图案的前半部分替换整个字符串。休息所有其他行将显示