删除特定步骤中的三行

删除特定步骤中的三行

我有这样的数据(这只是一小部分):

  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 机器上的任何 shell 中使用任何 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

相关内容