Sed / Awk删除选择性线

时间:2011-02-09 12:29:09

标签: unix awk sed line

这可能是一个简单的问题,但我很难找到解决方案,任何人都可以提供一个简单的UNIX sed或awk命令来删除文件的第3行和第4行,从第5行开始。

4 个答案:

答案 0 :(得分:2)

如果您使用的是GNU sed,则可以使用FIRST~STEP地址格式,例如

sed -e '6~3 d' -e '8~4 d' file

删除第6行,然后每隔3行删除第8行,然后删除第4行。

答案 1 :(得分:2)

假设我已理解这些要求,您可以按如下方式使用awk

pax$ echo '1
2
3
4
5
6
7
8
9
10
11
12
13
14
15' | awk '{if (((NR - 5) % 4 < 2) || (NR < 5)) {print}}'
1
2
3
4
5
6
9
10
13
14

如您所见,这使用NR(行号)来决定是否打印该行。

从第5行开始,它会打印两个,然后无限制地跳过两个。低于5,它会打印所有内容。

如果我误解了你想要跳过哪些行,理论仍然合理,你只需要调整if语句。

答案 2 :(得分:2)

awk解决方案,您将数字作为参数传递:

awk -v start=5 -v d1=3 -v d2=4 '
    {n = NR - start}
    n > 0 && (n % d1 == 0 || n % d2 == 0) {next} 
    1
'

这会跳过第8,11,14,......和9,13,17 ......,

答案 3 :(得分:0)

Perl怎么样?

perl -pi -e 'print if $. < 5 or 1 == $. % 4 or 2 = $. % 4' your_file