如何用AWK或Linux命令提取路径中的最后一级目录名?
解决路径提取需求:保留最后一级目录名
需求说明
有个文本文件,DIRECTORY列的路径长度不固定,还可能存在双斜杠,原始内容如下:
DIRECTORY FILES SIZE documents/my_name/directory1/ 2 96M documents/my_name/directory2/ 4 21M documents/my_name//directory3/ 1 43M
需要移除前缀路径,仅保留最后一级目录名,支持两种输出格式:要么保留目录名末尾的斜杠,要么去掉。
AWK实现方案
1. 保留末尾斜杠
用AWK可自动处理双斜杠问题,命令如下:
awk 'NR==1{print;next} {gsub(/\/+/,"/"); n=split($1,arr,"/"); $1=arr[n-1]"/"; print}' your_file.txt
- 第一行表头直接输出,不做处理
gsub(/\/+/,"/")把所有连续斜杠(包括双斜杠)替换成单斜杠,统一路径格式- 将处理后的路径按斜杠拆分成数组,取倒数第二个元素(原路径末尾带斜杠,最后一个元素为空),加上斜杠替换原路径列
- 输出处理后的整行内容
2. 去掉末尾斜杠
只需调整最后一步的目录提取逻辑:
awk 'NR==1{print;next} {gsub(/\/+/,"/"); n=split($1,arr,"/"); $1=arr[n-1]; print}' your_file.txt
Sed备选方案
如果习惯用sed命令,也能实现需求:
保留末尾斜杠
sed '2,$ s/.*\/\([^\/]*\/\)/\1/' your_file.txt
去掉末尾斜杠
sed '2,$ s/.*\/\([^\/]*\)\/$/\1/' your_file.txt
2,$指定从第二行开始处理,跳过表头- 通过正则匹配前缀路径,捕获最后一级目录名,替换为捕获的内容即可
内容的提问来源于stack exchange,提问作者sylar
相关产品推荐
相关产品推荐

