【问题标题】:Use awk command to get information below a pattern使用 awk 命令获取模式下方的信息
【发布时间】:2020-01-24 02:10:02
【问题描述】:

我有一个包含大量信息的文件,我想从这里提取一些数据。我只会在这里发布有趣的部分。我想提取 IQ 和 JQ 值以及上面两行的 J_ij[meV] 值。我读了这个问题How to print 5 consecutive lines after a pattern in file using awk,其中一个模式用于提取下面的信息,我正在考虑做类似的事情。我最初的想法是:

awk '/IQ =/ { print $6,$12 }  /IQ =/ {for(i=2; i<=2; i++){ getline; print $11 }}' input.text > output.txt

循环似乎不工作

IT   IQ   JT    JQ   N1 N2 N3    DRX    DRY    DRZ     DR         J_ij [mRy]     J_ij [meV]

 IT =  1 IQ =  **1**                     JT =  1 JQ =  **1**

->Q = ( -0.250,  0.722,  0.203)   ->Q = ( -0.250,  0.722,  0.203)

1    1    1    1    0  0  0   0.000  0.000  0.000   0.000      0.000000000     **0.000000000**

 IT =  1 IQ =  **1**                     JT =  6 JQ =  **6**

 ->Q = ( -0.250,  0.722,  0.203)   ->Q = (  0.000,  1.443,  0.609)

  1    1    6    6   -1  0 -1  -0.250 -0.144 -0.406   0.498      0.135692822     **1.846194885**

 IT =  1 IQ =  **1**                     JT =  8 JQ =  **8**

  ->Q = ( -0.250,  0.722,  0.203)   ->Q = (  0.000,  0.577,  0.609)

  1    1    8    8    0  0 -1   0.250 -0.144 -0.406   0.498      0.017676555     **0.240501782**

我的预期输出是:

IQ JQ J_ij [meV]
1 1 0.000000000
1 6 1.846194885
1 8 0.240501782

它来自粗体字(** **),第一行仅是指示性的。

【问题讨论】:

  • 欢迎来到 SO,特别感谢您在问题中添加您尝试的代码。您的输入示例不清楚,因此请将其包装在代码标签中,并在相关代码标签中提及预期输出,然后让我们知道。
  • I have a syntax error on "&amp;&amp;" and I don't know how I can fix it - 我不知道&amp;&amp; 应该是什么意思,但看起来您只想删除&amp;&amp;。或者您可以将整个 } &amp;&amp; /IQ =/ { 替换为 ;
  • @KamilCuk 它解决了我一半的问题,现在我需要从标签下方的 2 行中提取信息(循环似乎不起作用)
  • 好吧,看看i=2; i&lt;=2 您想从标签下方的两行或标签下方的第二行中提取信息?它看起来像print $6, $12; getline; getline; print $13。当然。你能解释一下输出是如何创建的吗?第一列来自哪里?第二列(输入中有很多6)?第三列?
  • 我只想从这些行中提取,我不知道我该怎么做@KamilCuk。我想从我的标签下方的第二行中提取。我重新编辑了我的问题。

标签: linux shell awk


【解决方案1】:

请您尝试以下操作。使用示例进行编写和测试。

awk '
BEGIN{
  print "IQ JQ J_ij [meV]"
}
FNR>1 && /IQ =/{
  value=$6 OFS $12
  found=1
  next
}
found && NF && !/ ->Q/{
  if(value){
     print value OFS $NF
  }
  value=found=""
}'  Input_file

输出如下。

IQ JQ J_ij [meV]
1 1 0.000000000
1 6 1.846194885
1 8 0.240501782

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2013-03-10
    • 2011-11-19
    • 1970-01-01
    • 2021-06-04
    • 2017-12-06
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多