用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



你可能感兴趣的:(shell)