用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
1	Jan
2	Feb
3	Mar
4	Apr
5	May
6	Jun
7	Jul
8	Aug
9	Sep
10	Oct
11	Nov
12	Dec

输出奇数行:

$ awk 'NR%2' test1.txt
1	Jan
3	Mar
5	May
7	Jul
9	Sep
11	Nov

输出偶数行:

$ awk '!(NR%2)' test1.txt
2	Feb
4	Apr
6	Jun
8	Aug
10	Oct
12	Dec

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

$ awk '++i%2' test1.txt
1	Jan
3	Mar
5	May
7	Jul
9	Sep
11	Nov

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

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

$ awk 'i++%2' test1.txt
2	Feb
4	Apr
6	Jun
8	Aug
10	Oct
12	Dec

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

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

$ sed -n '1~2p' test1.txt
1	Jan
3	Mar
5	May
7	Jul
9	Sep
11	Nov

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

$ sed -n '2~2p' test1.txt
2	Feb
4	Apr
6	Jun
8	Aug
10	Oct
12	Dec

注意中间是个波浪号~


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

$ awk 'NR%3==1' test1.txt
1	Jan
4	Apr
7	Jul
10	Oct

$ awk 'NR%3==2' test1.txt
2	Feb
5	May
8	Aug
11	Nov

$ sed -n '1~3p' test1.txt
1	Jan
4	Apr
7	Jul
10	Oct



  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值