如何用Bash或Awk提取文件表头每列的第三个分隔值(文件名)
提取表头行中文件路径的文件名
问题场景
有一个文件,其表头行的每列都是类似AAF2Y7VM5-8/cnv/F04_reads.tsv的文件路径,需要提取每列的文件名并输出,文件列数超过100列。
示例输入表头行:
AAF2Y7VM5-8/cnv/F04_reads.tsv AAF2Y7VM5-7/cnv/D04_reads.tsv AAF2Y7VM5-6/cnv/E04_reads.tsv
目标输出表头行:
F04_reads.tsv D04_reads.tsv E04_reads.tsv
以下是几种可行的解决方案:
Awk 方案
方案1:分割字段提取目标部分
NR==1 { for(i=1;i<=NF;i++) { split($i, path_parts, "/") printf "%s ", path_parts[3] } print "" } ZScores.txt
仅处理第一行,遍历每个字段,用/分割路径为数组后取第三个元素(文件名),最后补充换行保证格式正确。
方案2:正则替换简化操作
NR==1 {gsub(/[^[:space:]]+\//, "", $0); print} ZScores.txt
直接将第一行中所有非空格字符+斜杠的前缀替换为空,剩下的就是所有文件名。
Sed 方案
-n控制仅输出指定行;对第一行执行全局替换,移除每个路径的前缀部分,最后打印处理后的内容。
Bash 组合命令方案
head -n1 ZScores.txt | tr '\t' '\n' | awk -F/ '{print $3}' | tr '\n' ' ' && echo
步骤分解:
- 用
head取出第一行 - 把制表符转为换行,让每个路径单独一行
- 用
awk分割每行路径取第三个字段 - 再把换行转回空格,最后用
echo补换行
内容的提问来源于stack exchange,提问作者user2293045
相关产品推荐
相关产品推荐

