ファイル内の最初のN行の後、整数の前の行を削除します。

ファイル内の最初のN行の後、整数の前の行を削除します。

次のファイルがあります。

    1         2         3         4         5
 0.05775  0.00238  0.02514   0.00469  0.01882
 0.26868  0.04114  0.09359  0.02155  0.01367
 0.11413  0.00907  0.04032  0.02487   0.01156
 0.03759  0.00624  0.00819  0.01527   0.01128
 0.09910  0.03416  0.02280  0.00627   0.00433
    6         7         8         9        10
0.01798   0.00035   0.00672  0.02180  0.00184
0.01880  0.00834   0.04975  0.05503   0.00234
0.00242  0.00618   0.04936  0.02320   0.00269
 0.00931  0.00611   0.02371  0.00299   0.00353
 0.00763  0.00197  0.00673  0.00338   0.00182
   11        12        13        14        15
 0.00330   0.00521   0.00495   0.00426   0.00403
0.01121   0.02891   0.02162   0.02235   0.01534
0.01081   0.01871   0.00888   0.01835   0.00867
0.00684   0.00965   0.00645   0.00802   0.00317
0.00671   0.00333   0.00376  0.00204   0.00028

この例には、3 つの主要な情報が含まれています。各ブロックの最初の行には常に整数が含まれ、他の行には小数が含まれます。各ブロックの最初の4行を取得したいと思います。

出力:

    1         2         3         4         5
 0.05775  0.00238  0.02514   0.00469  0.01882
 0.26868  0.04114  0.09359  0.02155  0.01367
 0.11413  0.00907  0.04032  0.02487   0.01156
    6         7         8         9        10
0.01798   0.00035   0.00672  0.02180  0.00184
0.01880  0.00834   0.04975  0.05503   0.00234
0.00242  0.00618   0.04936  0.02320   0.00269
   11        12        13        14        15
 0.00330   0.00521   0.00495   0.00426   0.00403
0.01121   0.02891   0.02162   0.02235   0.01534
0.01081   0.01871   0.00888   0.01835   0.00867

sedで何かをしようとしましたが、成功しませんでした。

答え1

私は尋ねた:

すべてのブロックにヘッダー行があり、正確に5つの要素データ?それとも一部の行に可変量がありますか?

もしそうなら正確にブロックあたり6行を使用すると、次のことができます。

sed -n 'N;N;N;p;N;N' file.txt

ただし、そうでない場合は、以下を使用してください。

sed -n '/\./!{N;N;N;p;}' file.txt

後者のコマンドは、ピリオドのない行に会うと、その行と次の3行を印刷します(ピリオドがないことを確認せず)。次に、ピリオドのない別の行に会うまで、次の行をスキップします。


可能であれば、このデータを提供するツールを変更してより合理的な形式で提供することをお勧めします。

答え2

$ awk -v RS='\n  ' '{
   count=split($0,lines,/\n/);
   lines[1]="  "lines[1];
   max=4 ; if (count < max) { max = count };
   for (i=1; i <= max; i++) print lines[i];
  }' input 
     1         2         3         4         5
0.05775  0.00238  0.02514   0.00469  0.01882
0.26868  0.04114  0.09359  0.02155  0.01367
0.11413  0.00907  0.04032  0.02487   0.01156
    6         7         8         9        10
0.01798   0.00035   0.00672  0.02180  0.00184
0.01880  0.00834   0.04975  0.05503   0.00234
0.00242  0.00618   0.04936  0.02320   0.00269
   11        12        13        14        15
0.00330   0.00521   0.00495   0.00426   0.00403
0.01121   0.02891   0.02162   0.02235   0.01534
0.01081   0.01871   0.00888   0.01835   0.00867

スクリプトawkは各ブロックのヘッダー行が少なくとも2つの空白で始まり、データ行がそうでないという事実を利用します。レコード区切り記号(RS)を改行文字とスペースの2つに設定すると、各チャンクを個別に処理できます。

その後、各ブロックは別々の行に分割されます。最初の行の前に2つの空白文字が続きます(レコード区切り文字が占めるスペースを置き換えるため)。その後、最初の4行が印刷されます(ブロックに4行未満がある場合はそれ以下)。

関連情報