如何使用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
相关产品推荐
相关产品推荐

