在多个文件中的模式后打印行

时间:2016-02-27 07:56:12

标签: bash sed grep

我有几次具有相同模式的文件。 类似的东西:

   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

3 个答案:

答案 0 :(得分:3)

您可以使用此awk命令:

export const SOME_ACTION = 'SOME_ACTION';
export function someAction() {
  return (dispatch, getState) => {
    const {items} = getState().otherReducer;

    dispatch(anotherAction(items));
  }
}

这个awk命令基于固定前缀awk '/time/{close(out); out="output" ++i; next} {print > out}' file 和递增计数器out创建变量output,每当我们得到一行i时,它会递增。所有后续行都将重定向到此输出文件。关闭这些文件句柄以避免内存泄漏是一种很好的做法。

PS:如果您还想在输出中输入time行,请在上面的命令中删除time

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

我在这里找到了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

我知道文件allTemp的{​​{1}}次出现23。 Head将删除我打印到gen的行以及我不想要的两行,它会将新文件输出到xyzi