bash - 使用 bash 命令在列中创建编号集

标签 bash awk text set

我有这种类型的文件 - 2 列列表,其中基因位于第一列,染色体位置位于第二列。

        1:924024
        1:924310
SAMD11  1:930353
SAMD11  1:930939
NOC2L   1:944858
NOC2L   1:946247
KLHL17  1:960891
KLHL17  1:961945

需要转换为该列表类型,以便保存2列格式。每个组数字适用于每个基因(而不是每行)。

1:na         1:924024
2:na         1:924310
3:SAMD11    1:930353
3:SAMD11    1:930939
4:NOC2L     1:944858
4:NOC2L     1:946247
5:KLHL17    1:960891
5:KLHL17    1:961945

我尝试使用这一行:

   awk -F "\t" -v OFS="\t" '{ ($1=="")? ($1=NR":na"):($1=NR":"$1)}1' test.txt 

但是, 这使得行编号,我得到

1:na    1:924024
2:na    1:924310
3:SAMD11    1:930353
4:SAMD11    1:930939
5:NOC2L     1:944858
6:NOC2L     1:946247
7:KLHL17    1:960891
8:KLHL17    1:961945

而不是想要的

1:na         1:924024
2:na         1:924310
3:SAMD11    1:930353
3:SAMD11    1:930939
4:NOC2L     1:944858
4:NOC2L     1:946247
5:KLHL17    1:960891
5:KLHL17    1:961945

用 bash 可以做这样的事情吗? 谢谢!

最佳答案

$ awk 'BEGIN {FS=OFS="\t"} 
             {c+=!($1 in a)
              if($1=="") $1="na"
              else a[$1]
              print c":"$1, $2}' file | column -t 


1:na      1:924024
2:na      1:924310
3:SAMD11  1:930353
3:SAMD11  1:930939
4:NOC2L   1:944858
4:NOC2L   1:946247
5:KLHL17  1:960891
5:KLHL17  1:961945

关于bash - 使用 bash 命令在列中创建编号集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67672973/

相关文章:

bash - 在 block bash 脚本中写入多行

bash - 如何测试空字符串的多个变量

c - 用表达式参数的 printf 替换算术表达式

regex - 通过匹配模式用另一个文本文件中的行替换字符串

regex - 从 CSV 中用逗号分隔文本?

Java着色字符GUI

arrays - 在 for 循环的开头合并数组 (Bash)

linux - 如何使用 'cp'命令排除特定目录?

css - 如何自动为特定文本实例着色?

python - 将文本文件作为 Python 模块导入