複数ファイルのパターン別にライン印刷

複数ファイルのパターン別にライン印刷

同じパターンのファイルが複数回あります。それは次のとおりです。

   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

使用する状況別の出力オプションですgreptimeたとえば、ディレクトリ内のすべてのファイルの各エントリの後に3行を追加するには、次の手順を実行します。

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

grep3つのコンテキストオプションがあります。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に表示されるものに対応しますNtimefilename

関連情報