awk拆分行二

awk拆分行二

# 我们知道利用awk的RS变量能够拆分行,事实上使用awk的OFS变量也可以
root@bwhhkle:~# cat rows.bak 
1 2 3
root@bwhhkle:~# awk -v OFS="\n" '{print $1,$2,$3}' rows.bak 
1
2
3
如果有很多"字段"的话,岂不是非常麻烦,解决方案如下:
root@bwhhkle:~# awk -v OFS="\n" '{$1=$1;print $0}' rows.bak 
1
2
3
root@bwhhkle:~# awk -v OFS="\n" '{NF+=0;print $0}' rows.bak 
1
2
3

本质上上就是要使OFS变量的值提前生效
root@bwhhkle:~# awk 'BEGIN{OFS="\n"}{$1=!$1;print $0}' rows.bak
0
2
3
因为$1的值为1(非0为真),取非则为假变为0,所以$1=!$1即修改$1的值为0(=赋值语句)
由此我们可以简化为
root@bwhhkle:~# awk 'BEGIN{OFS="\n"}{$1=1;print $0}' rows.bak
1
2
3
但这不具有普适性,因为该测试文件非常简单。而如果比较复杂一些的字段,$1=$1或NF+=0更合适