我有一个总共1000行的文件,由10个数据块组成。每个数据块有100行。它看起来像
....
98
0 -40237.30 16.89 19.51 90.00 90.00 90.00 90.00
Si 1.03311 4.82796 43.16361 1 -342.75159
O 1.83529 2.77329 49.93318 1 -96.97488
O 5.35427 0.19473 46.20120 1 -103.69066
O 2.45071 5.03078 49.23054 1 -99.25241
.....
O 6.14626 12.60099 40.48765 1 -103.96326
O 14.02932 16.70495 49.61010 1 -86.95440
98
50 -40226.57 16.89 19.51 90.00 90.00 90.00 90.00
Si 1.02182 4.80803 43.16740 1 -353.40357
O 1.85563 2.79949 49.91912 1 -96.85369
...
因此它有两个标题行和98个数据行。标题行中的“98”表示数据行的数量。
在这里,我想从每个数据块中获取5行,第1行,第11行,第56行,第78行和第92行,并使用与原始文件类似的格式打印它们,如
...
5
O 13.62134 8.31539 48.25986 1 -75.85881
O 9.01739 6.38846 50.60192 1 -2.55755
O 14.76930 15.88060 42.57059 1 -79.24684
Si 7.58364 10.90020 43.49788 1 -348.34842
Si 13.15177 12.05531 40.63252 1 -262.49178
5
O 11.01042 14.50491 45.42672 1 -45.13971
O 3.99057 0.69779 44.08524 1 -147.51776
O 11.84402 0.82791 40.78757 1 -92.14344
Si 4.80766 10.22501 49.57940 1 -297.04787
Si 6.14936 17.03883 40.37907 1 -209.38634
....
喜欢这个。每条数据线只有5行(第1,第11,第56,第78和第92),并且就像上面的例子一样叠加。结果文件总共70行,由10个数据块组成,每个数据块有7行(2个标题行+5个数据行)
使用'grep'命令grep特定行没有问题,但是我不知道如何在数据块中使用grep,并且像这样堆叠。我想到了awk和grep的组合,但我无法理解。
答案 0 :(得分:2)
这应该有效:
awk '
{n = NR%100}
n == 1 || n == 2 || n == 3 || n == 13 || n == 58 || n == 80 || n == 94
' file
这将打印第一行和第二行(标题)以及98行块的第1行,第11行,第56行,第78行和第92行。
更改标题:
awk '
{n = NR%100}
n == 1 {print "5"; next}
n == 2 || n == 3 || n == 13 || n == 58 || n == 80 || n == 94
' file
答案 1 :(得分:2)
另一种虽然类似于awk的方式
由于第一条记录之前的两个标题行
,所有数字都是你所说的数字的+2awk '(NR%100)~/^(3|13|58|80|94)$/' file
(NR%100) If NR%100 (which will effectively loop every 100 from 0-99
~ Contains
^ $ Anchors so that only these exact values are used and not say 12 22 32 etc
| regex or
() a grouping
如果在解析参数后没有块,则awk中的默认动作是打印,因此如果参数为真,即mod 100等于任何数字,则打印该行。
如果你想打印每个第一条记录5(关于100)
awk '(x=NR%100)==1{print 5"\n"}x~/^(3|13|58|80|94)$/' file