打印奇数行与偶数行
2014-11-28awk或sed都可以实现。
1、awk实例:
awk 'NR%2' test.txt
awk '!(NR%2)' test.txt
NR是行号,awk的内建函数,当第一行,NR==1时,对2取余,结果是1,在awk的执行模式里,这个1就是pattern,为真,执行默认的{print},这个action操作。那么打印出该行,到第2行则余数是0,pattern为0,则为假,不会执行默认的{print},则不会输出偶数行。就达到了只输出奇数行的效果,反之则输出偶数行了。
或者:
awk '++i%2' file
awk 'i++%2' file
利用了C语言中 ++i 与 i++ 的区别,i++ 中i的值自加一次后这个表达式的结果等于1,但此时i的值仍然为0,为什么呢?i的值在当前表达式中不会改变,++i中i的值自加一次后,i的值是1。
awk 'i=!i' file
awk '!(i=!i)' file
awk 'and(FNR,1)' file
awk '!and(FNR,1)' file
awk里面有三个built-in function,分别是:and(a, b)按位与,or(a, b)按位或,xor(a, b)按位异或,当FNR为1的时候,就是第一行,1的2进制为0001,与0001按位与,得到结果是0001,0001的结果为真,就打印改行,当FNR为2时二进制表示为0010,那么又与0001相与,结果为0000,条件为假,则不打印。只有当FNR为奇数时,二进制的尾数为1,与0001相与结果才为真,否则结果都为假。即只输出奇数行,非则输出偶数行。
2、sed实例:
sed -n 'p;n' file
sed -n 'n;p' file
seq 6 | sed -n '1~2p'
seq 6 | sed -n '0~2p'
FIRST~STEP
This GNU extension matches every STEPth line starting with line FIRST.In particular, lines will be selected when there exists a non-negative N such that the current line-number equals FIRST + (N * STEP). Thus, to select the odd-numbered lines, one would use`1~2'.
每隔三行就在后面添加一个分割符:
seq 10 | sed '0~3a\=='
seq 10 | awk 'ORS=NR%3?"\n":"\n==\n"
3、行变列
sed -n 's/,/\n/g' file
cat test |tr "," "\n"
4、列变行
awk '{printf "%s", $1}' file
awk -vFS='\n' -vORS='' '$1=$1'
awk -vFS='\n' -vORS=',' '$1=$1' urfile