在多个文件中按模式打印行

在多个文件中按模式打印行

我有一个文件多次具有相同的模式。就像是:

   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 但我不知道如何将每个块输出到不同的文件中。

答案1

在 中使用线路重定向awk,例如

$ awk '{print "hello" >> "/tmp/hello"; print "world" >> "/tmp/world"}'

您可以对在 中定义的文件使用一个数组,然后像这样BEGIN使用它(在 中awk):

BEGIN{files[1]="first-file";
      files[2]="second-file";
      line=0}
/time/{line=NR}
{print >> files[NR-line]}

答案2

使用 的上下文输出选项grep。如果您想要time在目录中的所有文件中(例如)每次出现之后添加三行:

grep -A3 'time' /path/to/files/*

grep具有三个上下文选项 -A用于比赛后的行;B对于比赛之前的行,以及C完整的上下文(比赛之前和之后的行)。如果您想进一步拆分 的输出grep并且知道每个匹配将给出四行输出,您可以将输出通过管道传输到split -l4

答案3

使用新的 GNU sed

nl -bptime filename | 
sed -n '/time/{N;N;N;s/\([0-9]\+\)[^\n]*\n/echo >\1.txt \"/;s/$/\"/e;}'

time将在每个文件后打印 3 行N.txt其中N对应于time出现在filename

相关内容