如何修改AWK脚本仅为重复列值添加索引?
解决第二列重复值添加索引的AWK脚本问题
问题分析
你的需求是仅为第二列的重复值添加递增索引,唯一值保持原样,但原脚本会给所有值加上_1后缀——原因是不管第二列是否重复,count[$2]自增后都会强制拼接后缀,没有判断该值的总出现次数。
解决方案
需要先统计第二列每个值的总出现次数,再根据次数决定是否添加索引。以下是修正后的AWK脚本:
脚本实现
# 第一遍扫描文件,统计第二列每个值的出现次数 NR == FNR { freq[$2]++ next } # 第二遍处理文件,根据频率决定输出格式 { if (freq[$2] > 1) { # 重复值添加递增索引 print $1, $2 "_" ++count[$2] } else { # 唯一值直接输出原内容 print $1, $2 } }
使用方法
假设你的输入文件名为input.txt,执行命令:
awk -f fix_suffix.awk input.txt input.txt
或者直接写成单行命令:
awk 'NR==FNR{freq[$2]++;next} {if(freq[$2]>1) print $1,$2"_"++count[$2]; else print $1,$2}' input.txt input.txt
效果示例
输入文件内容:
a chr_1 b chr_4 c chr_4 d chr_2
执行脚本后输出:
a chr_1 b chr_4_1 c chr_4_2 d chr_2
脚本说明
NR == FNR:AWK中用于判断当前处理的是第一个输入文件(这里重复传入同一个文件,实现两次遍历),第一遍仅统计第二列每个值的总出现次数到freq数组。next:跳过后续处理逻辑,直接进入下一行。- 第二遍处理时,通过
freq[$2] > 1判断该值是否重复:重复则用count[$2]记录当前出现的次数并拼接后缀,唯一值直接输出原内容。
内容的提问来源于stack exchange,提问作者Paillou
相关产品推荐
相关产品推荐

