Regex sed:将部分输出复制到表中
我用G09来计算分子的电子性质,以用于我的硕士学位。我有很多输出文件,如果我把所有需要的数据都放在一个文件中,那就好了 我的想法是使用Regex sed:将部分输出复制到表中,regex,awk,sed,Regex,Awk,Sed,我用G09来计算分子的电子性质,以用于我的硕士学位。我有很多输出文件,如果我把所有需要的数据都放在一个文件中,那就好了 我的想法是使用sed命令选择数据,然后复制到另一个文件。然而,它并没有起到很好的作用。我将用3个例子解释原因: 这是输出文件的一部分,我对值-382.8066162(HF=-382.8066162)感兴趣: 为此,我在终端中使用以下命令: sed '/HF=.*RMSD/ {s/.*HF=//; s/RMSD.*//; b; }; d' < cs.log |tr -d '
sed
命令选择数据,然后复制到另一个文件。然而,它并没有起到很好的作用。我将用3个例子解释原因:
-382.8066162(HF=-382.8066162)
感兴趣:sed '/HF=.*RMSD/ {s/.*HF=//; s/RMSD.*//; b; }; d' < cs.log |tr -d '\' >> teste
数据跳过了一行-值6
位于下一行的开头-值后的单词也发生了变化(变为S2
)
HF=-382.3893192
感兴趣:HF=-382.3893192
被分成两行。第一部分HF=-382
和第二部分.3893192
我怎样才能修好它
谢谢能否请您尝试使用GNU
awk
中显示的样本编写并测试以下内容。用link编写并测试
将多个输入_文件传递给上述awk
程序,并可通过附加>输出_文件
例如-->
编辑:这里已经很晚了,所以只在ideone网站上用显示的样本编写和测试了这个
要处理匹配值中的换行符,可能还有其他方法,到目前为止,我只能想到这种正则表达式样式
awk'
BEGIN{ RS="" }
{
while(match($0,/HF=[-]?[0-9]+([.][0-9]+)?([\n] +([.][0-9]+))?/)){
val=substr($0,RSTART,RLENGTH)
sub(/\n */,"",val)
print val
val=""
$0=substr($0,RSTART+RLENGTH)
}
}
' Input_file
使用GNU awk匹配第三个参数(),并根据第三个示例输入进行测试:
awk -v RS= 'match($0,/HF=([^\\]+)/,a){gsub(/\s/,"",a[1]); print a[1]}' file
-382.3893192
使用
gnu awk
,您可以执行以下操作:
awk -v RS='\\\\HF=' 'NR>1{gsub(/\\.*|[[:space:]]+/, ""); print}' file
非常感谢。我只有一个观察:在第二个例子中,部分数据在下一行。因此,该值不仅是-382.79140,而且是-382.791406。我能修好它吗?@ElyGiancoli,很抱歉我没弄好。你能详细解释一下什么不起作用或者什么起作用吗?我编辑了这个问题,添加了一个新的例子。HF的实际值被分成两行。@ElyGiancoli,当然,请检查我的编辑答案,该答案与新行处理配合得很好,然后让我知道结果如何?我用我的文件进行了测试,结果是:“没有这样的文件或目录”。我不明白为什么。数字6在示例的下一行。一个文件是否可以包含多个所需的数据匹配?
awk '
match($0,/HF=[-]?[0-9]+([.][0-9]+)?/){
print substr($0,RSTART+3,RLENGTH-3)
}
' Input_file
awk '
match($0,/HF=[-]?[0-9]+([.][0-9]+)?/){
print substr($0,RSTART+3,RLENGTH-3)
}
' Input_file1 Input_file2 > output_file
awk'
BEGIN{ RS="" }
{
while(match($0,/HF=[-]?[0-9]+([.][0-9]+)?([\n] +([.][0-9]+))?/)){
val=substr($0,RSTART,RLENGTH)
sub(/\n */,"",val)
print val
val=""
$0=substr($0,RSTART+RLENGTH)
}
}
' Input_file
awk -v RS= 'match($0,/HF=([^\\]+)/,a){gsub(/\s/,"",a[1]); print a[1]}' file
-382.3893192
awk -v RS='\\\\HF=' 'NR>1{gsub(/\\.*|[[:space:]]+/, ""); print}' file
-382.8066162
-382.791406
-382.3893192