linux awk和grep每个数据块的特定行

时间:2014-12-02 19:07:06

标签: linux awk grep

我有一个总共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的组合,但我无法理解。

2 个答案:

答案 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的方式

由于第一条记录之前的两个标题行

,所有数字都是你所说的数字的+2
awk '(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