我有一个文件多次具有相同的模式。就像是:
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