使用bash选择某个基因,然后计算独特的变异

问题描述 投票:0回答:4

我有一个包含基因突变的 tsv 文件

基因 突变
A 错觉
错觉
删除
C 删除
D 删除
沉默
删除

我想:

  1. 选择具有基因 B 突变的行。
  2. 计算突变的独特类型。
  3. 计算每种类型的出现次数并排序。

输出应该是:

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
bash bioinformatics
4个回答
2
投票

你可以这样做(假设输入在 /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

它不是超级优雅-但是....


2
投票

您可以使用

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

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

1
投票

像下面这样的简单命令将为您提供非常接近您想要的输出。

命令:

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...
© www.soinside.com 2019 - 2024. All rights reserved.