我有一个简单的要求如下,
我得到绝对目录的文件名.
例如,/home/parent/child/filename
我的要求是从中删除文件名.
我试过的是:
awk -F "/" '{print $5}' input
Run Code Online (Sandbox Code Playgroud)
哪作得很好.
但是$5,如果我的输入具有如下结构,那么硬编码可能会有所不同:
/home/parent/child1/child2/filename
Run Code Online (Sandbox Code Playgroud)
所以它应该是动态的,没有硬编码.这是逻辑:
始终采用最后一个将是文件名的字段(因此需要从反向检查).
任何人都可以帮我解决awk substr函数或任何其他函数?
fed*_*qui 182
使用awk根据您可以定义的字段分隔符拆分字段中的行的事实.因此,为/您定义字段分隔符可以说:
awk -F "/" '{print $NF}' input
Run Code Online (Sandbox Code Playgroud)
当NF涉及当前记录的字段数时,打印$NF意味着打印最后一个记录.
所以给出这样的文件:
/home/parent/child1/child2/child3/filename
/home/parent/child1/child2/filename
/home/parent/child1/filename
Run Code Online (Sandbox Code Playgroud)
这将是输出:
$ awk -F"/" '{print $NF}' file
filename
filename
filename
Run Code Online (Sandbox Code Playgroud)
pio*_*kuc 30
在这种情况下,最好使用basename而不是awk:
$ basename /home/parent/child1/child2/filename
filename
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用bash 参数替换.
$ foo="/home/parent/child/filename"
$ echo ${foo##*/}
filename
$ foo="/home/parent/child/child2/filename"
$ echo ${foo##*/}
filename
Run Code Online (Sandbox Code Playgroud)
如果你对Perl解决方案持开放态度,这里有一个类似于fedorqui的awk解决方案:
perl -F/ -lane 'print $F[-1]' input
Run Code Online (Sandbox Code Playgroud)
-F/指定/字段分隔符
$F[-1]是@Fautosplit数组中的最后一个元素
就像晚了 5 年一样,我知道,感谢所有的建议,我过去是按以下方式这样做的:
$ echo /home/parent/child1/child2/filename | rev | cut -d '/' -f1 | rev
filename
Run Code Online (Sandbox Code Playgroud)
很高兴注意到有更好的礼仪