我有以下数据文件,由重复数据块组成。
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命令有没有简单的方法呢?
谢谢
答案 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。