我有一个包含基因突变的 tsv 文件
基因 | 突变 |
---|---|
A | 错觉 |
乙 | 错觉 |
乙 | 删除 |
C | 删除 |
D | 删除 |
乙 | 沉默 |
乙 | 删除 |
我想:
输出应该是:
Deletion 2
Missense 1
Silent 1
我尝试了以下 bash 命令,但它不起作用:
awk '$1 == B' filename | cut -f2 | sort | uniq | wc -l
我已经根据@jhnc 提供的答案尝试了这个命令并且它完美地工作:
awk '$1=="B"{n[$2]++} END{ for(m in n)print m,n[m] }' filename | sort| uniq
你可以这样做(假设输入在 /var/tmp/IP.tsv 中)
grep '^B\t' /var/tmp/IP.tsv | cut -f2 | sort -u | while read mutation; do \
echo $mutation $( grep -c "^B\t$mutation\$" /var/tmp/IP.tsv ); \
done
它不是超级优雅-但是....
您可以使用
grep -o
来过滤所需的输出,并使用 grep -c
来计算出现次数。
这远不是一个可靠的解决方案,但与您的起点并没有太大不同,应该可以完成工作:
#!/bin/bash
for mut in $(grep -o "^B.*" input.tsv | cut -f2 | sort | uniq)
do
printf "%s %s\n" $mut $(grep -c "^B.*$mut" input.tsv)
done
输出:
$ ./script.sh
Deletion 2
Missense 1
Silent 1
A 非常-非常大/数据输入/文件慢
bash
解决方案。
#!/usr/bin/env bash
search=B
input=file.tsv
declare -A uniq
while read -r Gene Mutation; do
[[ "$Gene" = "$search" ]] &&
((uniq["$Mutation"]++))
done < "$input"
for i in "${!uniq[@]}"; do
printf '%s %s\n' "$i" "${uniq[$i]}"
done | sort
像下面这样的简单命令将为您提供非常接近您想要的输出。
命令:
grep B filename | sort | uniq -c
输出:
2 B Deletion
1 B Missense
1 B Silent
要获得准确的输出,请使用以下命令:(更新为读取三个变量,感谢 jhnc。这正是我最初想要的,哈哈)
grep B filename | sort | uniq -c | while read i j k; do echo $k $i; done
为了让“grep”更健壮,你可以这样做
grep "^ *B.*" filename...