如何使用awk分割字段并提取最后一个子字段生成指定输出?
问题:用Awk提取固定位置后的最后一个子字段
输入内容示例:
field1 field2 field3 gene_id "xxxxx"; transcript_id "XM_xxxxxxxx.x"; db_xref "GeneID:102885392"; exon_number "1";
期望输出:
field1 field2 field3 exon_number "1";
尝试的Awk代码:
awk '{split($4,a,";"); print ($1, $2,$3, a[$NF])}' input
问题:无法正确获取split分割后的最后一个子字段,已知目标字段(exon_number)始终是最后一个,但位置不固定。
解决方案
Awk中split()函数会返回分割后数组的元素个数,所以可以直接用这个返回值作为索引来取最后一个元素——你之前误用的$NF表示当前输入行的最后一个字段,和split生成的数组完全无关。
正确代码示例1(适配更清晰的分割逻辑)
awk '{n=split($0,a,"; "); print $1, $2, $3, a[n]}' input
说明:
- 把分割符改为
"; "(分号加空格),避免分割出带前导空格的子字段,同时跳过原行末尾的空元素; - 用
n=split(...)拿到分割后的元素总数,a[n]就是最后一个目标子字段。
正确代码示例2(适配原代码的分割逻辑)
如果坚持用";"作为分割符,由于原行末尾的分号会导致split生成的最后一个元素是空字符串,需要取倒数第二个元素:
awk '{n=split($4,a,";"); print $1, $2, $3, a[n-1]}' input
内容的提问来源于stack exchange,提问作者Nico64
相关产品推荐
相关产品推荐

