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