我有一个文件,其中有几行包含字母数字字符串,如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的任何帮助。
答案 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
用图案的前半部分替换整个字符串。休息所有其他行将显示