特定の段階で3行を削除

特定の段階で3行を削除

私は次のデータを持っています(これはほんのわずかです):

  454SOL     OW20704   0.317   0.251   5.525
  454SOL    HW120705   0.388   0.322   5.531
  454SOL    HW220706   0.229   0.290   5.553
  462SOL     OW20728   0.130   1.821   5.295
  462SOL    HW120729   0.120   1.806   5.394
  462SOL    HW220730   0.044   1.857   5.259
  469SOL     OW20749   0.461   1.266   5.451
  469SOL    HW120750   0.411   1.267   5.365
  469SOL    HW220751   0.398   1.248   5.527
  500SOL     OW20842   1.754   1.223   5.312
  500SOL    HW120843   1.845   1.184   5.299
  500SOL    HW220844   1.762   1.319   5.336
  502SOL     OW20848   1.592   1.629   5.349
  502SOL    HW120849   1.619   1.663   5.259
  502SOL    HW220850   1.671   1.591   5.395
  515SOL     OW20887   1.587   0.779   5.394
  515SOL    HW120888   1.495   0.817   5.389
  515SOL    HW220889   1.647   0.826   5.329
  516SOL     OW20890   1.013   0.105   5.494
  516SOL    HW120891   1.019   0.190   5.442
  516SOL    HW220892   1.045   0.029   5.437
  522SOL     OW20908   1.728   0.935   5.578
  522SOL    HW120909   1.682   0.928   5.489
  522SOL    HW220910   1.666   0.979   5.644

3行を削除し、次の9行はそのままにして、3行をもう一度削除したいと思います。この場合、10、11、12行と22、23、24行を削除したいと思います。期待される出力

  454SOL     OW20704   0.317   0.251   5.525
  454SOL    HW120705   0.388   0.322   5.531
  454SOL    HW220706   0.229   0.290   5.553
  462SOL     OW20728   0.130   1.821   5.295
  462SOL    HW120729   0.120   1.806   5.394
  462SOL    HW220730   0.044   1.857   5.259
  469SOL     OW20749   0.461   1.266   5.451
  469SOL    HW120750   0.411   1.267   5.365
  469SOL    HW220751   0.398   1.248   5.527
  502SOL     OW20848   1.592   1.629   5.349
  502SOL    HW120849   1.619   1.663   5.259
  502SOL    HW220850   1.671   1.591   5.395
  515SOL     OW20887   1.587   0.779   5.394
  515SOL    HW120888   1.495   0.817   5.389
  515SOL    HW220889   1.647   0.826   5.329
  516SOL     OW20890   1.013   0.105   5.494
  516SOL    HW120891   1.019   0.190   5.442
  516SOL    HW220892   1.045   0.029   5.437

私はこれを試しました:

#!/bin/bash 
awk 'NR%10==0 || NR%11==0 || NR%12==0' sol.txt | tee sol_after.txt 

しかし、うまくいきません。

ファイル全体の行を削除する必要があるため、10-12、22-24、34-36、46-48などを削除してください。

答え1

すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ seq 30 | awk 'NR%12 !~ /^(10|11|0)$/'
1
2
3
4
5
6
7
8
9
13
14
15
16
17
18
19
20
21
25
26
27
28
29
30

または必要に応じて:

$ seq 30 | awk 'NR%12 == 10{c=3} !(c&&c--)'
1
2
3
4
5
6
7
8
9
13
14
15
16
17
18
19
20
21
25
26
27
28
29
30

バラよりhttps://stackoverflow.com/a/17914105/1745001何をc&&c--もっと学びます。

答え2

GNU sedと"skip"演算子を使用してください。

$ printf 'Line %2d\n' {1..25} | sed  -n '10~12{n;n;n};p'
Line  1
Line  2
Line  3
Line  4
Line  5
Line  6
Line  7
Line  8
Line  9
Line 13
Line 14
Line 15
Line 16
Line 17
Line 18
Line 19
Line 20
Line 21
Line 25

答え3

それぞれawk:

awk -v n=9 -v d=3 '
    ((NR - skip) > n && (NR - skip) <= n+d){f = 1;next}
    NR > n && f {f=0;skip = NR-1} 1
' file

より多くの行でテストしてください。

for i in {1..50}
do printf '%d\n' "$i"
done | awk -v n=9 -v d=3 '
    ((NR - skip) > n && (NR - skip) <= n+d){f = 1;next}
    NR > n && f {f=0;skip = NR-1} 1
'

これをshスクリプトでラップし、単に境界を変更して省略する行を選択できます。つまり、 n印刷する行数と制限に達したd後に省略する行数n

関連情報