从同一标识符中提取确切数量的元素

从同一标识符中提取确切数量的元素

我有一个如下所示的文件:

Id       Chr     Start   End    
Prom_1   chr1    3978952 3978953  
Prom_1   chr1    3979165 3979166  
Prom_1   chr1    3979192 3979193  
Prom_2   chr1    4379047 4379048  
Prom_2   chr1    4379091 4379092  
Prom_2   chr1    4379345 4379346  
Prom_2   chr1    4379621 4379622  
Prom_3   chr1    5184469 5184470  
Prom_3   chr1    5184495 5184496  

我想计算相同的标识符出现了多少次。就像是:

Prom_1  3  
Prom_2  4  
Prom_3  2  

任何想法都非常感激。

答案1

GNU 数据混合

$ datamash -W --header-in groupby 1 count 2 < file
Prom_1  3
Prom_2  4
Prom_3  2

答案2

您可以使用以下方式计算标识符uniq

tail -n +2 input | cut -d' ' -f1 | sort | uniq -c

请注意,uniq需要排序的输入。我们用来tail跳过标题并cut“剪切”第一列。

输出示例:

  3 Prom_1
  4 Prom_2
  2 Prom_3

如果数字较小的 id 应在数字较大的 id 之前打印(例如Prom_3before Prom_10),您可以替换sortsort -V(版本排序):

tail -n +2 input2 | cut -d' ' -f1 | sort -V | uniq -c

示例输出(input2 包含 id 的额外行Prom_10):

  3 Prom_1
  4 Prom_2
  2 Prom_3
  1 Prom_10

答案3

你可以使用 awk

awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file

NR>1忽略标头
a[$1]++是一个哈希迭代器

答案4

类似于 user3589054 的内容:

由于有很多 Id,当您排序时,您将不会获得相同的 Id 顺序,因为例如以 Prom_1 Prom_10 等开头的 Id 将排在第一个。所以我所做的是这个并且效果很好:

awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file | awk -F "_" '{print $1"\t"$2"\t"}' | cut -f 2 | sort -n | awk -F " " '{print $1"\t"$2}' | sed 's/^/Prom_/' > file.output.txt

其中:
awk 'NR>1 {a[$1]++} END { for (x in a) { print x,a[x] } } ' file |
您将获得带有 ID 和编号但未排序的输出

awk -F "_" '{print $1"\t"$2"\t"}' | 您将在 Prom 、编号、ID 编号和数量中拆分文件

cut -f 2 | sort -n |
根据编号Id及其对应的金额排序

awk -F " " '{print $1"\t"$2}' |
在这里您可以选择两列

sed 's/^/Prom_/'
最后将 Prom_ 附加到其号码 Id 前面

相关内容