如何使用gawk的gensub捕获文件扩展名?

如何使用gawk的gensub捕获文件扩展名?,awk,Awk,假设一个gawk变量fpath包含一个扩展名为tmp/myfile.txt的完整文件路径。但是,此文件扩展名可以是任何文件扩展名。如何使用gensub返回文件扩展名?gensub上有一个文档页面。看起来您有一个shell变量,您只需设置适当的字段分隔符即可,如下所示。只需将字段分隔符设置为。并在此处打印最后一个字段值 echo "tmp/myfile.txt" | awk -F'.' '{print $NF}' 如果$fpath是一个shell变量,您希望将其值传递给awk

假设一个gawk变量fpath包含一个扩展名为tmp/myfile.txt的完整文件路径。但是,此文件扩展名可以是任何文件扩展名。如何使用gensub返回文件扩展名?gensub上有一个文档页面。

看起来您有一个shell变量,您只需设置适当的字段分隔符即可,如下所示。只需将字段分隔符设置为。并在此处打印最后一个字段值

echo "tmp/myfile.txt" | awk -F'.' '{print $NF}'
如果$fpath是一个shell变量,您希望将其值传递给awk,我建议使用shell特性。例如,对于bash:

$f='tmp/myfile.txt' $echo${f*} 文本 $f='tmp/myfile.txt.abc' $echo${f*} abc *。将删除到最后。在字符串中。如果需要,请使用${f*}。也有关详细信息,请参阅。

如果您必须以任何价格使用gensub,请按照以下步骤操作:

awk 'BEGIN{fpath="tmp/myfile.txt";print gensub(/.*\./, "", 1, fpath)}' emptyfile.txt
输出

txt
请注意,此解决方案将删除直到最后的任何内容。因此,对于tmp/myfile.tar.gz,您将得到gz


在gawk 4.2.1中测试一个简单的awk,在最后一点之前移除所有内容:


awk'{sub/^.*\./,}1'您可以进一步破解awk NF:

g/mawk -F. '$0=$NF'
因为我不关心用OFS替换FS,所以直接用$NF的扩展名覆盖整行$0

我也在{}之外编写了它们,这意味着在分配任务之后,扩展将直接打印出来

唯一的一个小缺点是,如果目录/文件夹已经被导入,它们也会被打印出来,并且像典型的自述文件那样没有扩展名的文件会逐字打印完整的文件名


无需调用sub、gsub、index、match、gensub甚至print语句。见鬼,不需要正则表达式。

fpath在awk或shell上下文中是一个变量?您是否关心没有扩展部分(如/tmp/myfile或/myfile)的情况?@Inian它将在awk/gawk上下文中。无需注意;它不会删除任何内容,只是不会输出到last的任何内容。如果调整正则表达式,使其从字符串的开头开始,点击last/,然后在第一个处停止,会怎么样。?那会是什么样子?我知道。这不符合我的要求,我知道。这不符合我的要求。
g/mawk -F. '$0=$NF'