我正在读这个awk
剧本
awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
我想知道1
它最后的作用是什么。
答案1
程序awk
是一系列条件-动作对,条件位于大括号之外,动作包含在大括号内。如果条件的计算结果为零或空字符串,则该条件被视为 false,其他任何值都为 true(未初始化的变量为零或空字符串,具体取决于上下文,因此它们为 false)。可以暗示条件或动作;没有条件的大括号(如您的开始)被认为具有真实条件,并且在被击中时始终执行,并且当且仅当满足条件时,任何没有操作的条件才会打印该行。
脚本末尾1
的 是一个没有任何操作的条件(始终为真),因此它对每一行执行默认操作,打印该行(可能已被大括号中的上一个操作修改)。
答案2
我真的不喜欢这些类型的快捷方式,因为它混淆并误导了它的解析方式。当您读到类似的内容时awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
,您可能会认为正在1
修改前面的语句。或者您可能认为1
是 的别名{print}
,这在技术上是不正确的。
实际上,1
是一个完全独立的声明。您可以像这样分隔语句:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
每个 awk 语句的格式都是condition {action}
.如果没有{action}
给定,则默认操作是{print}
。 (如果没有condition
给定,则默认条件true
。)
所以这里1
是条件,true
由于它不为零,因此它的计算结果始终为 。被省略,因此执行action
默认值。{print}
你可以这样想:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
答案3
1
意思是打印每一行。
awk 语句与编写相同:
awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'