【问题标题】:Print lines after a pattern in several files在多个文件中的模式后打印行
【发布时间】:2016-02-28 14:19:04
【问题描述】:

我有一个文件多次使用相同的模式。 类似的东西:

   time
   12:00
   12:32
   23:22
   time
   10:32
   1:32
   15:45

我想打印模式后面的行,例如time 在几个文件中。模式之后的行数是恒定的。 我发现我可以通过awk '/time/ {x=NR+3;next}(NR<=x){print}' filename 得到我问题的第一部分 但我不知道如何将每个块输出到不同的文件中。

编辑

我的文件比我原来的问题要复杂一些。 它们具有以下格式。

4
gen
 C        -4.141000       -0.098000        0.773000
 H        -4.528000       -0.437000       -0.197000
 H        -4.267000        0.997000        0.808000
 H        -4.777000       -0.521000        1.563000
 4
 gen
 C        -4.414000       -0.398000        4.773000
 H        -4.382000       -0.455000       -4.197000
 H        -4.267000        0.973000        2.808000
 H        -4.333000       -0.000000        1.636000

我想打印后面的行

  4
  gen

编辑 2

我的预期输出是x 文件x=# pattern。 在我的第二个示例中,我想要两个文件:

 C        -4.141000       -0.098000        0.773000
 H        -4.528000       -0.437000       -0.197000
 H        -4.267000        0.997000        0.808000
 H        -4.777000       -0.521000        1.563000

 C        -4.414000       -0.398000        4.773000
 H        -4.382000       -0.455000       -4.197000
 H        -4.267000        0.973000        2.808000
 H        -4.333000       -0.000000        1.636000

【问题讨论】:

标签: bash sed grep


【解决方案1】:

你可以使用这个 awk 命令:

awk '/time/{close(out); out="output" ++i; next} {print > out}' file

这个 awk 命令基于固定前缀 output 和递增计数器 i 创建变量 out,每次我们得到一行 time 时递增计数器。所有后续行都重定向到此输出文件。关闭这些文件句柄以避免内存泄漏是一个好习惯。

PS:如果你想在输出中也有time 行,然后在上面的命令中删除next

【讨论】:

  • 我没有真正明白。实际上我希望每个块都放入一个不同的文件中。
  • 确实为每个块创建了不同的文件。你测试了吗?它正在创建名称为output1output2output3 等的输出文件
  • 感谢@anubhava 提供的示例文件,我给它确实有效。我的问题有点复杂。我编辑了我的问题。
  • 好的,您还可以通过编辑问题来包含新的预期输出吗?
【解决方案2】:

修订后的“4/gen”要求有些含糊,但以下脚本(只是@anubhava 的变体)符合给定的要求,并且可以轻松修改以处理各种边缘情况:

awk '
  /^ *4 *$/ {close(out); out=0; next}
  /^ *gen *$/ && out==0 {out = "output." ++i; next}
  out {print > out} '

【讨论】:

    【解决方案3】:

    我在这里找到了来自 anubhava 的另一个答案How to print 5 consecutive lines after a pattern in file using awk 并使用 head 和 for 循环解决了我的问题: for i in {1..23}; do grep -A25 "gen" allTemp | tail -n 25 > xyz$i; head -n -27 allTemp > allTemp2; cp allTemp2 allTemp; done

    我知道文件allTemp23 出现gen。 Head 将删除我打印到xyzi 的行以及我不想要的两行,并将一个新文件输出到allTemp2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2017-02-20
      • 2011-07-16
      • 2013-06-23
      相关资源
      最近更新 更多