我有这样的数据(这只是一小部分):
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