我有一个如下所示的文件:
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
$ 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_3
before Prom_10
),您可以替换sort
为sort -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 前面