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