次のファイルがあります。
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行未満がある場合はそれ以下)。