如何使用linux命令阻止删除特定行?

时间:2014-10-23 18:11:18

标签: linux bash awk

我有以下数据文件,由重复数据块组成。

 486  Examples                    Iteration:  300000 #Bonds:  10
    1    6    3    5    7  371    0    0    0    0    0    0    1  0.935  0.932  0.955  0.852  0.000  0.000  0.000  0.000  0.000  0.000  3.736  0.000  1.303
    2    6    4  143  386  389    0    0    0    0    0    0    1  0.892  0.877  0.855  0.918  0.000  0.000  0.000  0.000  0.000  0.000  3.751  0.000  0.999
    3    3    1   18    0    0    0    0    0    0    0    0    1  0.935  0.901  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  1.926  2.000 -0.708
    4    3    2   18    0    0    0    0    0    0    0    0    1  0.892  0.923  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  1.829  2.000 -0.756
...
  482    3   16  483    0    0    0    0    0    0    0    0    1  0.954  0.831  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  1.809  2.000 -0.716
  483    2  482    0    0    0    0    0    0    0    0    0    1  0.831  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.884  0.000  0.457
  484    2  485    0    0    0    0    0    0    0    0    0  105  0.865  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.936  0.000  0.372
  485    3  213  484    0    0    0    0    0    0    0    0  105  0.835  0.865  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  1.779  2.000 -0.665
  486    2  440    0    0    0    0    0    0    0    0    0   44  0.829  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.896  0.000  0.345
   634.597636118845        347.992894465888        1330.58342505062
 -1.280885974547230E-005
 486  Examples                    Iteration:  300001 #Bonds:  10
    1    6    3    5    7  371    0    0    0    0    0    0    1  0.935  0.932  0.955  0.852  0.000  0.000  0.000  0.000  0.000  0.000  3.736  0.000  1.303
    2    6    4  143  386  389    0    0    0    0    0    0    1  0.892  0.877  0.855 
...

同样,我的数据文件由许多数据块组成,每个数据块总共有489行。但实际数据线只有486行,有1个标题行和2个拖尾行。

这里,我希望删除所有数据块的1个标题行和2个拖尾行(删除所有数据的每一行(1 * n,488 * n和489 * n)行.n =数据块的数量)并删除浮动的所有列(仅读取到第13列)。所以,我希望得到像

这样的文件
    1    6    3    5    7  371    0    0    0    0    0    0    1  
    2    6    4  143  386  389    0    0    0    0    0    0    1  
    3    3    1   18    0    0    0    0    0    0    0    0    1
    ...
    484    2  485    0    0    0    0    0    0    0    0    0  105
    485    3  213  484    0    0    0    0    0    0    0    0  105
    486    2  440    0    0    0    0    0    0    0    0    0   44
    1    6    3    5    7  371    0    0    0    0    0    0    1  
    2    6    4  143  386  389    0    0    0    0    0    0    1 
    ...

这种格式。如何在每个数据块中删除1个标题行+ 2个拖尾行?我想我可以通过awk print命令读取前13列。但我不知道如何从数据中删除那些额外的行。使用awk + ​​NR组合或其他linux命令有没有简单的方法呢?

谢谢

2 个答案:

答案 0 :(得分:1)

假设样本行真正代表了数据,那么这样的东西可能会起作用。

awk 'NF <= 8 {next} NF=13' datafile

但是会丢失列格式。假设每一行在每一列中都有一个值,您可以通过将输出汇总到column -t来重建柱状格式,尽管这与输入不同。

该代码段中的8是一个任意数字,大于给定且小于13的任何示例行上的字段数。

答案 1 :(得分:1)

您可以使用模数仅过滤掉每个块中的非数据行,以仅打印特定行。然后,您可以使用for循环仅打印前13个列。

awk 'NR  % 489 != 0 && NR % 489 != 1 && NR % 489 != 488 {for (i = 1; i < 13; i++) printf "%s\t",$i; print ""}' Input.txt

一些解释:

NR是行号,从1开始。&&是逻辑AND。我们正在打印编号为mod 489的所有行1,488和489。