나는 다음과 같은 데이터를 가지고 있습니다(이것은 단지 작은 부분일 뿐입니다):
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