특정 단계에서 세 줄 삭제

특정 단계에서 세 줄 삭제

나는 다음과 같은 데이터를 가지고 있습니다(이것은 단지 작은 부분일 뿐입니다):

  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

관련 정보