You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用awk追加文件名列并截断第一个句点后的文件名内容

awk实现提取文件名第一个句点前内容并新增列的方案

原写法失效原因

shell的${FILENAME%.format.flt.txt}这类参数截断语法是shell专属特性,不属于awk内置语法,直接写在awk脚本中无法被解析执行。

可行实现方案

方案1:纯awk内部处理(支持多文件批量操作)

直接在awk脚本内通过内置字符串函数处理文件名,仅在每个文件的第一行处理一次文件名,执行效率高,同时支持一次传入多个文件自动匹配对应文件名前缀:

awk -v OFS='\t' '
FNR==1 {
    fn = FILENAME
    sub(/\..*/, "", fn)
}
{print $1, $2, $3, $4, fn}
' A0631-Somatic-WGS.format.flt.txt

逻辑说明:

  • FNR==1是awk内置判断条件,仅在处理每个文件的第一行时触发,避免每行重复处理文件名
  • sub(/\..*/, "", fn)会匹配变量fn中第一个英文句点及其后的所有内容,替换为空字符串,最终得到第一个句点前的文件名前缀
  • 输出时使用处理完成的fn变量作为新增列内容,制表符分隔的格式和原有需求完全一致

执行后输出效果:

X	120143898	6	88725363	A0631-Somatic-WGS
X	147991648	6	132706871	A0631-Somatic-WGS

方案2:Shell预处理文件名后传入awk(适合单文件/特殊后缀场景)

如果只处理单个文件,也可以先在shell层完成文件名截断,再通过-v参数把处理好的名称传入awk使用:

file_path="A0631-Somatic-WGS.format.flt.txt"
awk -v OFS='\t' -v file_prefix="${file_path%%.*}" '{print $1,$2,$3,$4,file_prefix}' "$file_path"

其中${file_path%%.*}是shell原生参数展开语法,会删除字符串中第一个.及之后的所有内容,得到需要的文件名前缀。


内容的提问来源于stack exchange,提问作者Fidi Naj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:54:15