如何用Bash将表格指定列数值减1且保留表头?
问题:处理带表头的表格时避免修改表头列
我有一个带表头的大型表格,需要将第二列(hg19_pos)的数值全部减1,其余列保持不变。使用awk命令处理时,表头的第二列被错误修改为-1,现寻求正确的实现方法。
原表格
chr hg19_pos hg19_pos ref alt REVEL Ensembl_transcriptid 1 35142 35142 G A 0.027 ENST00000417324 1 35142 35142 G C 0.035 ENST00000417324 1 35142 35142 G T 0.043 ENST00000417324 1 35143 35143 T A 0.018 ENST00000417324 1 35143 35143 T C 0.034 ENST00000417324 1 35143 35143 T G 0.039 ENST00000417324 1 35144 35144 A C 0.012 ENST00000417324 1 35145 35145 C A 0.023 ENST00000417324 1 35145 35145 C G 0.029 ENST00000417324
期望结果
chr hg19_pos hg19_pos ref alt REVEL Ensembl_transcriptid 1 35141 35142 G A 0.027 ENST00000417324 1 35141 35142 G C 0.035 ENST00000417324 1 35141 35142 G T 0.043 ENST00000417324 1 35142 35143 T A 0.018 ENST00000417324 1 35142 35143 T C 0.034 ENST00000417324 1 35142 35143 T G 0.039 ENST00000417324 1 35143 35144 A C 0.012 ENST00000417324 1 35144 35145 C A 0.023 ENST00000417324 1 35144 35145 C G 0.029 ENST00000417324
尝试的命令及错误输出
awk '{ $2-=1; print $1,$2,$3,$4,$5,$6,$7,$8 }' revel_with_transcript_ids.bed | head chr -1 hg19_pos ref alt REVEL Ensembl_transcriptid 1 35141 35142 G A 0.027 ENST00000417324 1 35141 35142 G C 0.035 ENST00000417324 1 35141 35142 G T 0.043 ENST00000417324 1 35142 35143 T A 0.018 ENST00000417324 1 35142 35143 T C 0.034 ENST00000417324 1 35142 35143 T G 0.039 ENST00000417324 1 35143 35144 A C 0.012 ENST00000417324 1 35144 35145 C A 0.023 ENST00000417324 1 35144 35145 C G 0.029 ENST00000417324
正确实现方法
核心思路是跳过表头行(第一行),只对数据行进行列值修改。使用awk的NR(记录号)变量判断行号:
命令1:简洁写法
awk '{ if(NR>1) $2 -= 1; print }' revel_with_transcript_ids.bed | head
命令2:更清晰的分支写法
awk 'NR==1 {print; next} { $2 = $2 - 1; print }' revel_with_transcript_ids.bed | head
说明
NR==1:匹配第一行(表头),直接打印后用next跳过后续处理,避免修改表头。NR>1:对所有数据行,将第二列的值减1后打印,其余列保持不变。
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

