Regex sed:将部分输出复制到表中

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 '

我用G09来计算分子的电子性质,以用于我的硕士学位。我有很多输出文件,如果我把所有需要的数据都放在一个文件中,那就好了

我的想法是使用
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