簡體   English   中英

每個數據塊的linux awk和grep特定行

[英]linux awk and grep specific lines for each datablocks

我有一個文件,共有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
....

像這樣。 grep每條數據線只有5行(第1、11、56、78和92行),並且像上面的示例一樣堆疊。 結果文件總計70行,由10個數據塊組成,每個數據塊有7行(2個標題行+ 5個數據行)

使用'grep'命令對特定行進行grep我沒有問題,但是我不知道如何在數據塊方式中使用grep,並像這樣堆疊。 我當時在想awk和grep的結合,但我不知道。

這應該工作:

awk '
    {n = NR%100}
    n == 1 || n == 2 || n == 3 || n == 13 || n == 58 || n == 80 || n == 94
' file

這將打印98行塊的第一行和第二行(標題)以及第一行,第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

盡管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中的默認操作是打印,因此,如果參數為true,即mod 100等於任何數字,則將打印該行。

如果要在每個第一條記錄中打印5條(相對於100條)

  awk '(x=NR%100)==1{print 5"\n"}x~/^(3|13|58|80|94)$/' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM