Linux下生成文件名-路径两列tab分隔文件的脚本修正求助
实现方案
你原有脚本未做路径剥离处理,导致第一列携带完整路径,以下提供两种可直接运行的实现方式,输出完全符合「第一列为不带路径、不带.fasta后缀的纯文件名,第二列为文件完整绝对路径,制表符分隔」的要求。
方案1:find+awk 实现(兼容性最好)
该方案对包含空格、特殊字符的文件名兼容性更强,默认不递归扫描子目录,如需递归可删除-maxdepth 1参数:
# 将命令中 /your/target/dir 替换为你要扫描的实际目录绝对路径 find /your/target/dir -maxdepth 1 -type f -name "*.fasta" | sort | awk -F '/' '{ full_path = $0 pure_name = $NF sub(/\.fasta$/, "", pure_name) print pure_name "\t" full_path }' > out.txt
参数说明:
-maxdepth 1:限制仅扫描指定目录的首层文件,不进入下级子目录-type f:仅匹配普通文件,排除目录、软链接等特殊类型sub(/\.fasta$/, "", pure_name):移除第一列文件名末尾的.fasta后缀,匹配示例格式要求
方案2:基于原有脚本修改(改动量最小)
保留你原脚本的写法逻辑,仅补充文件名提取步骤即可:
# 将 TARGET_PATH 的值替换为你要扫描的实际目录路径 TARGET_PATH="PATH" paste -d '\t' \ <(printf "%s\n" "$TARGET_PATH"/*.fasta | xargs -n1 basename | sed 's/\.fasta$//' | sort) \ <(printf "%s\n" "$TARGET_PATH"/*.fasta | sort) \ > out.txt
改动说明:
- 新增
xargs -n1 basename流程,从全路径中提取纯文件名 - 新增sed逻辑移除第一列的
.fasta后缀 - 第二列直接保留排序后的完整路径,无需重复拼接字符串
输出效果参考
若指定目录下存在test1.fasta、test2.fasta两个文件,最终生成的out.txt内容格式如下(两列以制表符分隔):
test1 /your/target/dir/test1.fasta test2 /your/target/dir/test2.fasta
内容的提问来源于stack exchange,提问作者Ana Paulo
相关产品推荐
相关产品推荐

