GNU awk的$1=$1到底有什么作用?$0=$0呢?
2016-12-15 09:31
225 查看
转载:http://www.codeweblog.com/gnu-awk%E7%9A%84-1-1%E5%88%B0%E5%BA%95%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8-0-0%E5%91%A2/
GNU awk的$1=$1到底有什么作用?$0=$0呢?
$1=$1 是用来激活$0的重新赋值,也就是说 字段$1...和字段数NF的改变会促使awk重新计算$0的值,通常是在改变OFS后而需要输出$0时这样做
echo "A B C D" | awk '{OFS="|";print $0;$1=$1;print $0;}'
A B C D
A|B|C|D
即使OFS放在BEGIN里,也没有用
echo "A B C D" | awk 'BEGIN{OFS="|"}{print $0;$1=$1;print $0;}'
A B C D
A|B|C|D
$0=$0 刚好相反, 修改$0的值可以促使awk重新计算字段$1...和字段数NF的的值,通常是在改变FS后而需要输出$1...或者NF时这样做
echo "A|B|C|D" | awk '{FS="|";print $1,NF;$0=$0;print $1,NF}'
A|B|C|D 1
A 4
不过把修改FS放在BEGIN里,就没必要$0=$0了
echo "A|B|C|D" | awk 'BEGIN{FS="|"}{print $1,NF;$0=$0;print $1,NF}'
A 4
A 4
其实,在awk源码中.重新计算$0的值的函数名叫rebuild_record,重构记录的意思.默认情况下.这个函数是不可能执行的.因为$0是直接读入的.$1=$1等修改字段的行为会触发awk执行这个函数
重新计算$1...的值的函数名叫reset_record,重新分割记录到字段的意思.默认情况下.这个函数只在处理完当前行,读入下一行之前执行.中途是不会执行的.$0=$0等修改记录的行为会触发awk执行这个函数
通过在源码中添加一行标记重新编译awk.可以查看awk到底什么时候运行了这两个函数.
rebuild_record
echo "A B C D" | awk '{print $0;OFS="|";print "OFS=\"|\"";print $0;print "$1=$1";$1=$1;print $0;}'
-----------reset_record----------- #读入行之前,执行reset_record,把$0拆分开赋值给$1...
A B C D #$0为读入的值
OFS="|" #改变OFS
A B C D #没有触发rebuild_record重构$0,$0仍为读入的值.
$1=$1 #执行$1=$1,
----------rebuild_record------------ #awk不管$1是否真的改变,执行rebuild_record.
A|B|C|D #$0的值成为各个字段和ORS计算出的值
reset_record
echo "A|B|C|D" | awk '{print $1,NF;print "FS=\"|\"";FS="|";print $1,NF;print "$0=$0";$0=$0;print $1,NF}'
-----------reset_record----------- #读入行之前,执行reset_record,把$0拆分开赋值给$1...
A|B|C|D 1 #$1为刚才计算的值
FS="|" #改变FS
A|B|C|D 1 #没有触发reset_record重构$1和NF,仍为第一次计算的值.
$0=$0 #执行$0=$0
-----------reset_record----------- #awk不管$0是否真的改变,执行reset_record.
A 4 #$1和NF的值成为重新计算出的值
GNU awk的$1=$1到底有什么作用?$0=$0呢?
$1=$1 是用来激活$0的重新赋值,也就是说 字段$1...和字段数NF的改变会促使awk重新计算$0的值,通常是在改变OFS后而需要输出$0时这样做
echo "A B C D" | awk '{OFS="|";print $0;$1=$1;print $0;}'
A B C D
A|B|C|D
即使OFS放在BEGIN里,也没有用
echo "A B C D" | awk 'BEGIN{OFS="|"}{print $0;$1=$1;print $0;}'
A B C D
A|B|C|D
$0=$0 刚好相反, 修改$0的值可以促使awk重新计算字段$1...和字段数NF的的值,通常是在改变FS后而需要输出$1...或者NF时这样做
echo "A|B|C|D" | awk '{FS="|";print $1,NF;$0=$0;print $1,NF}'
A|B|C|D 1
A 4
不过把修改FS放在BEGIN里,就没必要$0=$0了
echo "A|B|C|D" | awk 'BEGIN{FS="|"}{print $1,NF;$0=$0;print $1,NF}'
A 4
A 4
其实,在awk源码中.重新计算$0的值的函数名叫rebuild_record,重构记录的意思.默认情况下.这个函数是不可能执行的.因为$0是直接读入的.$1=$1等修改字段的行为会触发awk执行这个函数
重新计算$1...的值的函数名叫reset_record,重新分割记录到字段的意思.默认情况下.这个函数只在处理完当前行,读入下一行之前执行.中途是不会执行的.$0=$0等修改记录的行为会触发awk执行这个函数
通过在源码中添加一行标记重新编译awk.可以查看awk到底什么时候运行了这两个函数.
rebuild_record
echo "A B C D" | awk '{print $0;OFS="|";print "OFS=\"|\"";print $0;print "$1=$1";$1=$1;print $0;}'
-----------reset_record----------- #读入行之前,执行reset_record,把$0拆分开赋值给$1...
A B C D #$0为读入的值
OFS="|" #改变OFS
A B C D #没有触发rebuild_record重构$0,$0仍为读入的值.
$1=$1 #执行$1=$1,
----------rebuild_record------------ #awk不管$1是否真的改变,执行rebuild_record.
A|B|C|D #$0的值成为各个字段和ORS计算出的值
reset_record
echo "A|B|C|D" | awk '{print $1,NF;print "FS=\"|\"";FS="|";print $1,NF;print "$0=$0";$0=$0;print $1,NF}'
-----------reset_record----------- #读入行之前,执行reset_record,把$0拆分开赋值给$1...
A|B|C|D 1 #$1为刚才计算的值
FS="|" #改变FS
A|B|C|D 1 #没有触发reset_record重构$1和NF,仍为第一次计算的值.
$0=$0 #执行$0=$0
-----------reset_record----------- #awk不管$0是否真的改变,执行reset_record.
A 4 #$1和NF的值成为重新计算出的值
相关文章推荐
- GNU awk的$1=$1到底有什么作用?$0=$0呢?
- GNU awk的$1=$1到底有什么作用?$0=$0呢?
- 在JAVA中线程到底起到什么作用!
- css 中的background:transparent到底是什么意思有什么作用
- fs:[0]到底表示什么?fs段寄存器在WINDOWS系统中的作用
- 在JAVA中线程到底起到什么作用!
- 分层对我们开发到底有什么作用呢?
- 把一个宏定义成do {} while(0); 到底有什么作用。
- css 中的background:transparent到底是什么意思有什么作用
- 中继器,集线器,交换机,网桥,网关,路由器的功能作用,区别到底是什么
- zookeeper在dubbo到底起了什么作用,dubno如何解决了阿里的高并发问题?
- 基类中的虚方法到底有什么作用?
- CNN 中, 1X1卷积核到底有什么作用呢?
- 请问基类中的虚方法到底有什么作用?
- 到底什么是hash?它起什么作用?
- spring在ssh框架中到底起到什么作用
- java 的接口到底起什么作用
- C/C++运行时库到底在Windows中起什么作用(猜想)
- extern"C"到底做了什么,起流什么作用
- 到底什么作用