私は次のデータを持っています(これはほんのわずかです):
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