删除文件中前 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

该示例包含三个主要信息块。每个块的第一行始终包含整数,而其他行包含小数。我想获取每个块的前 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

我问:

所有块是否都有一个标题行并且确切地五行数据?或者某些行的金额是否可变?

如果它是确切地每块 6 行,您可以使用:

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

但如果没有,则使用:

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

后一个命令在遇到没有任何句点的行时,将打印该行和以下三行(不检查它们是否有句点)。然后它将跳过以下行,直到遇到另一行没有句点的行。


如果可以的话,我建议修复提供此数据的工具,以便以更合理的格式提供数据。

答案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脚本利用了以下事实:每个块的标题行至少以两个空格开头,而数据行则不然。如果我们将记录分隔符 ( RS) 设置为换行符后跟两个空格,则可以单独处理每个块。

然后每个块被分成单独的行。第一行前面有两个空格字符(以替换记录分隔符占用的空格),然后打印前 4 行(或者更少,如果块中碰巧少于 4 行)。

相关内容