![如何更改制表符分隔文本文件中重复的行中的列](https://linux22.com/image/81170/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%94%B9%E5%88%B6%E8%A1%A8%E7%AC%A6%E5%88%86%E9%9A%94%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E8%A1%8C%E4%B8%AD%E7%9A%84%E5%88%97.png)
假设我有这么多行
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 8376144 8380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
预期输出:
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1_1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 83761448380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2_1 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2_2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
我想要一种方法来更改在 $4 列中重复的第二行(以及第三行、第四行等)。我只想添加一个“_1”字符串,以便它读取“SGIP_1”或“WhateverGeneName_1”。
awk 或 sed 解决方案最好。预先非常感谢。
答案1
在你想要的最简单的情况下全部_N
即使基因名称只出现一次,您也可以执行以下操作:
$ awk '$4=$4"_"++a[$4];' file.gff
chr1 66999638 66999638 SGIP1_1 1 +
chr1 66999251 66999251 SGIP1_2 1 +
chr1 33545778 33549778 AZIN2_1 1 +
chr1 8376144 8380144 SLC45A1_1 1 +
chr1 16765166 16769166 NECAP2_1 1 +
chr1 33544713 33548713 AZIN2_2 1 +
chr1 25069759 25073759 CLIC4_1 1 +
chr1 33544729 33548729 AZIN2_3 1 +
chr1 50487626 50491626 AGBL4_1 1 -
chr1 92349836 92353836 TGFBR3_1 1 -
请注意,这会将字段分隔符更改为单个空格。要保持制表符分隔(GFF 文件应该如此),请使用:
$ awk -vOFS="\t" '$4=$4"_"++a[$4];' file.gff
chr1 66999638 66999638 SGIP1_1 1 +
chr1 66999251 66999251 SGIP1_2 1 +
chr1 33545778 33549778 AZIN2_1 1 +
chr1 8376144 8380144 SLC45A1_1 1 +
chr1 16765166 16769166 NECAP2_1 1 +
chr1 33544713 33548713 AZIN2_2 1 +
chr1 25069759 25073759 CLIC4_1 1 +
chr1 33544729 33548729 AZIN2_3 1 +
chr1 50487626 50491626 AGBL4_1 1 -
chr1 92349836 92353836 TGFBR3_1 1 -
如果你只想修改那些多次出现的基因的名称,它会变得有点复杂:
$ awk -vOFS="\t" '(++a[$4]>1){$4=$4"_"a[$4]-1}1;' file.gff
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1_1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 8376144 8380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2_1 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2_2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
答案2
使用 awk
awk -vOFS="\t" '{$4=a[$4]++?$4"_"a[$4]-1:$4}1' file
chr1 66999638 66999638 SGIP1 1 +
chr1 66999251 66999251 SGIP1_1 1 +
chr1 33545778 33549778 AZIN2 1 +
chr1 8376144 8380144 SLC45A1 1 +
chr1 16765166 16769166 NECAP2 1 +
chr1 33544713 33548713 AZIN2_1 1 +
chr1 25069759 25073759 CLIC4 1 +
chr1 33544729 33548729 AZIN2_2 1 +
chr1 50487626 50491626 AGBL4 1 -
chr1 92349836 92353836 TGFBR3 1 -
如果仅出现一次,则将 $4 设置为等于自身,或者将_
出现的次数加上负 1。