shell - 使用 shell 脚本解析数据。 (排序/uniq/grep)

标签 shell parsing for-loop

我想根据strand(第8列)和tss(第5列)为每个引用基因(第7列)检索具有uniq计数(第4列)的行。 如果引用基因具有相同的计数数并且位于负链上,则保留具有最高 tss 的行,同样 如果引用基因具有相同的计数数并且位于正链上,则保留 tss 最低的行

我正在研究格式的数据:

CHR TSS-25bp    TSS+25bp    count   tss Ensemble transcript refgene strand
chr15   79554474    79554524    2   79554499    ENSMUST00000089311  Sun2    -
chr15   79554475    79554525    2   79554500    ENSMUST00000100439  Sun2    -
chr15   79554477    79554527    2   79554502    ENSMUST00000046259  Sun2    -
chr15   79569054    79569104    1   79569079    ENSMUST00000159660  Sun2    -
chr15   79570243    79570293    4   79570268    ENSMUST00000160355  Sun2    -
chr17   44914075    44914125    2   44914100    ENSMUST00000050630  Supt3h  +
chr17   44914248    44914298    3   44914273    ENSMUST00000130623  Supt3h  +
chr17   44914319    44914369    3   44914344    ENSMUST00000127798  Supt3h  +
chr11   87551028    87551078    2   87551053    ENSMUST00000152700  Supt4h1 +
chr11   87551029    87551079    2   87551054    ENSMUST00000141169  Supt4h1 +
chr7    29099891    29099941    2   29099916    ENSMUST00000003527  Supt5h  -
chr11
78020504    78020554    3   78020529    ENSMUST00000108314  Supt6h  -

我希望输出中是这样的:

CHR TSS-25bp    TSS+25bp    count   tss Ensemble transcript refgene strand
chr15   79554477    79554527    2   79554502    ENSMUST00000046259  Sun2    -
chr15   79569054    79569104    1   79569079    ENSMUST00000159660  Sun2    -
chr15   79570243    79570293    4   79570268    ENSMUST00000160355  Sun2    -
chr17   44914075    44914125    2   44914100    ENSMUST00000050630  Supt3h  +
chr17   44914248    44914298    3   44914273    ENSMUST00000130623  Supt3h  +
chr11   87551028    87551078    2   87551053    ENSMUST00000152700  Supt4h1 +
chr7    29099891    29099941    2   29099916    ENSMUST00000003527  Supt5h  -
chr11   78020504    78020554    3   78020529    ENSMUST00000108314  Supt6h  -

到目前为止我已经有了这个,

#!/bin/bash

example=Workbook4.txt
for gene in `cut -f7 example | uniq`
   do
   sign=`grep $gene example | cut -f8 | uniq`
   for count in `grep $gene example | cut -f4 | sort | uniq`
   do
      if [ "$sign" == "-" ]
      then
      grep $gene example | grep $count example | sort -k5 | head -1 ----
      else
      grep $gene example | grep $count example | sort -k5 | tail -1 ----
   done
   break
done

我不确定粗体部分。如果你能帮我解决这个问题那就太好了。

最佳答案

这似乎给出了您想要的输出:

awk '
    NR==1 {print; next} 
    {key = $4 SUBSEP $7 SUBSEP $8}
    !(key in line) || ($8 == "-" && $5 > tss[key]) || ($8 == "+" && $5 < tss[key]) {
        line[key] = $0
        tss[key] = $5
    }
    END {for (key in line) print line[key]}
' file
CHR TSS-25bp    TSS+25bp    count   tss Ensemble transcript refgene strand
chr11   78020504    78020554    3   78020529    ENSMUST00000108314  Supt6h  -
chr15   79569054    79569104    1   79569079    ENSMUST00000159660  Sun2    -
chr15   79554477    79554527    2   79554502    ENSMUST00000046259  Sun2    -
chr17   44914248    44914298    3   44914273    ENSMUST00000130623  Supt3h  +
chr17   44914075    44914125    2   44914100    ENSMUST00000050630  Supt3h  +
chr15   79570243    79570293    4   79570268    ENSMUST00000160355  Sun2    -
chr11   87551028    87551078    2   87551053    ENSMUST00000152700  Supt4h1 +
chr7    29099891    29099941    2   29099916    ENSMUST00000003527  Supt5h  -

关于shell - 使用 shell 脚本解析数据。 (排序/uniq/grep),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23636774/

相关文章:

java - 来自互联网的 Android XML 解析

android - 解析本地xml android

java - 为什么我的循环在计算最后一个数字之前就跳出了?

C - 使用指针创建更高效​​的循环来遍历字母表

c - 我已经为模式编写了 C 代码,但是我犯了一个我无法识别的小错误

python - base64 和 MIME base 64 有什么区别?

shell - awk: hping: 打印 icmp 发起/接收之间的差异

bash - 展平目录结构并保留重复文件

Linux 不使用 ECHO 命令将字符串保存到文件

php - 当 XML 包含 namespace 时如何将 XPath 与 PHP 一起使用