linux用sed打印文件奇数行,用sed或awk打印文本文件的奇数行和偶数行

grep、sed和awk是Linux下文本处理的三剑客,用惯了之后,就再也不想用Excel处理数据了。

用awk来实现奇数行和偶数行的输出,思路很简单,就是判断NR变量。NR是行号,行号是2的倍数,自然是偶数行。

大家知道,不加{print}语句也能默认输出整行,例如

awk 'NR==1' test1.txt

输出的是第一行,那么用NR对2取模,当余数为1时,awk的执行模式判断为真,就会执行默认的{print}输出奇数行,当余数不为1时,判断为假,不执行输出,所以偶数行就不会输出。

原文件test1.txt内容:

cat test1.txt

1Jan

2Feb

3Mar

4Apr

5May

6Jun

7Jul

8Aug

9Sep

10Oct

11Nov

12Dec

输出奇数行:

$ awk 'NR%2' test1.txt

1Jan

3Mar

5May

7Jul

9Sep

11Nov

输出偶数行:

$ awk '!(NR%2)' test1.txt

2Feb

4Apr

6Jun

8Aug

10Oct

12Dec

上面的输出奇数行还可以换成:

$ awk '++i%2' test1.txt

1Jan

3Mar

5May

7Jul

9Sep

11Nov

利用++i,变量自增1后再对2取模,实现输出奇数行。

而利用i++,变量先对2取模,再自增1,那么第一行的时候,i的初始值为0,取模结果为FALSE,因此只输出偶数行。

$ awk 'i++%2' test1.txt

2Feb

4Apr

6Jun

8Aug

10Oct

12Dec

用sed又如何实现奇数行和偶数行的输出呢?

sed通常用-n -p选项结合来输出指定的行,sed有一个步长的设置,例如从第一行开始,每2行输出,则输出奇数行如下:

$ sed -n '1~2p' test1.txt

1Jan

3Mar

5May

7Jul

9Sep

11Nov

那么,从第二行开始,每2行输出,就是输出偶数行:

$ sed -n '2~2p' test1.txt

2Feb

4Apr

6Jun

8Aug

10Oct

12Dec

注意中间是个波浪号~

那么隔2行输出该怎么做呢?

$ awk 'NR%3==1' test1.txt

1Jan

4Apr

7Jul

10Oct

$ awk 'NR%3==2' test1.txt

2Feb

5May

8Aug

11Nov

$ sed -n '1~3p' test1.txt

1Jan

4Apr

7Jul

10Oct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值