如何用awk为字段添加缺失的chr前缀?
用awk为文件指定字段添加chr前缀
需要用awk处理文件,给第二个字段开头没有chr前缀的内容加上该前缀,已有前缀的则保留。之前尝试的两个命令都存在问题:第一个会给所有第二个字段重复添加chr;第二个逻辑错误,无法给缺失前缀的字段添加前缀。
原始文件内容
ASPA,17:3483575-3483585 ATM,11:108289609-108289613 ATP7B,13:51937469-51937480 ATR,chr3:142562768-142562773 BAG3,chr10:119670120-119670123
期望输出
ASPA,chr17:3483575-3483585 ATM,chr11:108289609-108289613 ATP7B,chr13:51937469-51937480 ATR,chr3:142562768-142562773 BAG3,chr10:119670120-119670123
尝试的错误命令
命令1(重复添加chr)
awk -F, '{$2="chr"$2; print}' file
问题:无论第二个字段是否已有chr前缀,都会直接在字段前拼接chr,导致已有前缀的字段变成chrchrXXX格式。
命令2(逻辑无效)
awk -F, '$2 !~/chr/{gsub("chr","chr",$2)}1' file
问题:gsub("chr","chr",$2)是把字段中的chr替换为chr,完全没有添加前缀的作用,等于未做任何有效修改。
正确的awk命令
方法1:条件判断按需添加(推荐)
awk -F, 'BEGIN{OFS=","} $2 !~/^chr/ {$2="chr"$2} 1' file
-F,:指定逗号为字段分隔符BEGIN{OFS=","}:设置输出字段分隔符为逗号,避免打印时字段被空格分隔$2 !~/^chr/:判断第二个字段开头是否不含chr(^表示匹配字段起始位置){$2="chr"$2}:满足条件时为字段添加chr前缀1:awk中1代表执行默认打印操作,输出当前行
方法2:正则替换实现
awk -F, 'BEGIN{OFS=","} sub(/^([^c]|c[^h]|ch[^r])/,"chr&",$2) 1' file
通过正则匹配开头不是chr的情况,直接替换为chr加原内容,逻辑更紧凑。
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

