你能解释一下下面这段代码是如何工作的吗?
l_Basename="hello_world.ksh"
l_THIS_FILE=`echo $l_Basename | awk -F. '{field=1
while (field < NF) {
printf $field
if (field < NF - 1) {
printf "."}
field++}
printf "\n"}'`
答案1
-F.
套字段分隔符到.
:给定一行a.b.c.
,awk 将看到四个字段:、、、a
和(一个空字段)。b
c
field=1
while (field < NF)
{
printf $field
if (field < NF - 1)
{
printf "."
}
field++
}
- 代码循环遍历每个字段并打印出来。请注意,
field
从 1 开始,因为字段 0 是整行(或记录,准确地说)。因为检查是< NF
,它永远不会到达最后一个字段。 - 直到倒数第二个字段,它添加了一个
.
,大概是作为其他程序处理的字段分隔符。
总而言之,这段代码是一种复杂的实现方式basename
,该命令通常用于从文件名中去除扩展名:
$ basename hello_world.ksh .ksh
hello_world
即使在 中awk
,更简洁的方法是将字段数减少一:NF--
,并将输出字段分隔符设置为.
,以便它自动添加到字段之间:
$ echo hello_world.ksh | awk -F. -v OFS=. '{NF--}1'
hello_world
答案2
“-F”选项允许更改 Awk 的“字段分隔符”字符。Awk 将每行输入数据视为由多个“字段”组成,这些“字段”本质上是用空格分隔的单词。空格(或制表符)是默认的“字段分隔符”。在某些情况下,输入数据可能被另一个字符(例如“:”)分隔,如果能够告诉 Awk 使用不同的字段分隔符就好了。这就是“-F”选项的作用。要调用 Awk 并指定“:”作为字段分隔符,我们这样写:
awk -F: ...
在这种情况下,字段分隔符是“。”