同じパターンのファイルが複数回あります。それは次のとおりです。
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
たとえば、ディレクトリ内のすべてのファイルの各エントリの後に3行を追加するには、次の手順を実行します。
grep -A3 'time' /path/to/files/*
grep
3つのコンテキストオプションがあります。A
一致後の行、B
一致前の行、完全なC
コンテキスト(一致の前後の行)。出力をさらに分割し、各一致が4行の出力を提供することを知りたい場合は、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