2011-02-09 71 views
0

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

+0

可能有帮助显示一些示例输入和您想要的输出。 – 2011-02-09 17:30:50

回答

2

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

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

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

+0

干杯找到了这个,但没有GNU sed,应该说明这一点! – DrewC 2011-02-09 13:40:04

0

Perl怎么样?

perl -pi -e 'print if $. < 5 or 1 == $. % 4 or 2 = $. % 4' your_file 
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声明。

+0

谢谢!这很好用! – DrewC 2011-02-09 13:42:06

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,...