【问题标题】:(sed/awk) Extract values from text to csv file - even/odd lines pattern(sed/awk) 从文本中提取值到 csv 文件 - 偶数/奇数行模式
【发布时间】:2012-02-18 00:20:14
【问题描述】:

我需要从给定的 ASCII 文本文件中导出一些数值,并将其导出为特定格式的 csv 文件。输入文件有偶数/奇数行模式:

 SCF Done:  E(UHF) =  -216.432419652     A.U. after   12 cycles
 CCSD(T)= -0.21667965032D+03
 SCF Done:  E(UHF) =  -213.594303492     A.U. after   10 cycles
 CCSD(T)= -0.21379841974D+03
 SCF Done:  E(UHF) =  -2.86120139864     A.U. after    6 cycles
 CCSD(T)= -0.29007031339D+01
 and so on

我需要第 5 列的奇数行值和第 2 列的偶数行值。它们应该打印在分号分隔的 csv 文件中,每行有 10 个值。所以输出应该是这样的

-216.432419652;-0.21667965032D+03;-213.594303492;-0.21379841974D+03;-2.86120139864;-0.29007031339D+01; ...linebreak after 5 pairs of values

我从awk '{print $5}'awk '{print $2}' 开始,但是我没有成功创建一个只作用于偶数/奇数行的模式。

一个简单的方法来做到这一点?

【问题讨论】:

    标签: csv sed awk row


    【解决方案1】:

    这样的事情可能会奏效-

    awk '{x = NF > 3 ? $5 : $2 ; printf("%s;",x)}(NR % 10 == 0){print OFS}' file
         |_____________________|       |________| |___________||_________|
                   |                        |           |           |
         This is a `ternary operator`,  Print with `NR` is a    `OFS` is another built-in
      what it does is checks the line  formatting  a built-in    that has a default value of
      for number of fields (`NF`). If    to add    that keeps    `\n`
     the number of fields is more than    a ";"    track of 
     3, we assign $5 value to variable x          number of lines.
          else we assign $2 value                 We are using modulo  
                                                 operator to check when
                                                 10 lines are crossed.
    

    【讨论】:

    • 在其中添加一些空格:它是免费的!您不希望您的代码成为维护的噩梦。
    • @Alex1167623 已添加信息并清理格式。
    【解决方案2】:

    这可能对你有用:

     tr -s ' ' ',' <file | paste -sd',\n' | cut -d, -f5,11 | paste -sd',,,,\n'
    

    【讨论】:

      【解决方案3】:

      给定一个名为 data.txt 的文件,尝试:

      awk '/SCF/{ printf $5 ";"; } /CCSD/{ printf($2); } NR % 10 == 0 { printf "\n"; }' data.txt
      

      【讨论】:

      • 效果也很好,不要仅仅依赖于其他关键字的偶数/奇数行。谢谢
      【解决方案4】:

      以下脚本没有使用awk 的强大功能,但会为您完成这项工作并且希望可以理解:

      NR % 2 { printf $5 ";" }
      NR % 2 == 0 { printf $2 ";" }
      NR % 10 == 0 { printf "\n" }
      END { printf "\n" }
      

      用法(以上另存为script.awk):

      awk -f script.awk input.txt
      

      【讨论】:

      • 感谢您的回复。它运行良好且易于理解。
      猜你喜欢
      • 2014-02-14
      • 2011-04-04
      • 2010-11-29
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      相关资源
      最近更新 更多