【问题标题】:Select matrix first row based on 1st, 8th and 9th column value with awk or sed使用 awk 或 sed 根据第 1、第 8 和第 9 列值选择矩阵第一行
【发布时间】:2015-06-30 07:22:12
【问题描述】:

我有一些行,其中第 1、第 8 和第 9 列基本相同。总行数远远超过 60K。现在我想简化只保留第 1、8 和 9 列相同的第一行。

输入文件:

chr exon_start  exon_end    cnv tumor_DOC   control_DOC rationormalized_after_smoothing CNV_start   CNV_end seg_mean
chr1    762097  762270  3   821 717 1.456610215 762097  6706109 1.297328502
chr1    861281  861490  3   101 117 1.29744744  762097  6706109 1.297328502
chr1    7868860 7869039 2   78  119 1.123385189 7796356 8921423 1.088752407
chr1    7869841 7870041 2   140 169 1.123385189 7796356 8921423 1.088752407
chr1    7870411 7870596 2   83  163 1.123385189 7796356 8921423 1.088752407
chr1    7879297 7879467 2   290 360 1.024742732 7796356 8921423 1.088752407
chr1    21012415    21012609    3   89  135 1.230421209 19536504    21054539    1.247494175
chr1    21013924    21014512    3   234 219 1.359224182 19536504    21054539    1.247494175
chr1    21016588    21016803    3   172 179 1.230421209 19536504    21054539    1.247494175
chr1    21024895    21025101    3   147 120 1.230421209 19536504    21054539    1.247494175
chr14   20920169    20920704    3   211 214 1.254261327 20840851    20923828    1.288877208
chr14   20922716    20922919    3   253 262 1.228396526 20840851    20923828    1.288877208
chr14   20923634    20923828    3   188 201 1.206226522 20840851    20923828    1.288877208
chr14   20924141    20924329    2   244 344 0.902299535 20924141    21465086    1.088234038
chr14   20924787    20925701    2   314 306 1.305351797 20924141    21465086    1.088234038
chr14   20926636    20926836    2   134 136 1.206226522 20924141    21465086    1.088234038

期望的输出:

chr exon_start  exon_end    cnv tumor_DOC   control_DOC rationormalized_after_smoothing CNV_start   CNV_end seg_mean
chr1    762097  762270  3   821 717 1.456610215 762097  6706109 1.297328502
chr1    7869841 7870041 2   140 169 1.123385189 7796356 8921423 1.088752407
chr1    21024895    21025101    3   147 120 1.230421209 19536504    21054539    1.247494175
chr14   20922716    20922919    3   253 262 1.228396526 20840851    20923828    1.288877208
chr14   20924141    20924329    2   244 344 0.902299535 20924141    21465086    1.088234038

我只为具有相似第 1 列、第 8 列和第 9 列的每个不同类别保留一行,最好是在有变化时只保留第一行。

如何在 awk、sed 或 R 中实现这一点?

【问题讨论】:

    标签: r awk sed


    【解决方案1】:

    只有一个awk 行:

    awk '!seen[$1,$8,$9]++' file
    

    这会在数组seen[] 中跟踪给定元组(field1, field8, field9) 到目前为止出现了多少次。当它看到一时,计数器加一。当值已经是 1 或更大时,!value 将被评估为 False,因此 awk 不会打印该行。

    第一次:

    • seen[$1,$8,$9]0(未设置时的默认值)。
    • !0 的计算结果为 True,因此将打印该行。
    • seen[$1,$8,$9] 加一。

    下次:

    • seen[$1,$8,$9]1 或更多。
    • !1 计算结果为 False,因此该行打印。
    • seen[$1,$8,$9] 加一。

    测试

    $ awk '!seen[$1,$8,$9]++' a
    chr exon_start  exon_end    cnv tumor_DOC   control_DOC rationormalized_after_smoothing CNV_start   CNV_end seg_mean
    chr1    762097  762270  3   821 717 1.456610215 762097  6706109 1.297328502
    chr1    7868860 7869039 2   78  119 1.123385189 7796356 8921423 1.088752407
    chr1    21012415    21012609    3   89  135 1.230421209 19536504    21054539    1.247494175
    chr14   20920169    20920704    3   211 214 1.254261327 20840851    20923828    1.288877208
    chr14   20924141    20924329    2   244 344 0.902299535 20924141    21465086    1.088234038
    

    【讨论】:

    • 很好,我正要提出同样的建议。我怀疑这已经有一个规范的问题了?
    • 对不起,我没有得到答案..这里的文件名对吗?
    • 谢谢它完美运行,对不起,我有点困惑..后来我意识到颜色的变化并理解了文件命名约定
    • @ fedorqui ,也完美解释了.. 非常感谢.. 有时我需要一些时间来在 R 和 awk 之间切换..
    • 通常我们为此命名数组seen。我认为现在当人们看到一个名为 seen 的数组时,他们知道该数组的用途是什么,因此给数组起这个名称不仅仅是一种装饰偏好。
    【解决方案2】:

    将您的数据导入 R(您将指定文件):

    DF <- read.table(text = "chr exon_start  exon_end    cnv tumor_DOC   control_DOC rationormalized_after_smoothing CNV_start   CNV_end seg_mean
    chr1    762097  762270  3   821 717 1.456610215 762097  6706109 1.297328502
    chr1    861281  861490  3   101 117 1.29744744  762097  6706109 1.297328502
    chr1    7868860 7869039 2   78  119 1.123385189 7796356 8921423 1.088752407
    chr1    7869841 7870041 2   140 169 1.123385189 7796356 8921423 1.088752407
    chr1    7870411 7870596 2   83  163 1.123385189 7796356 8921423 1.088752407
    chr1    7879297 7879467 2   290 360 1.024742732 7796356 8921423 1.088752407
    chr1    21012415    21012609    3   89  135 1.230421209 19536504    21054539    1.247494175
    chr1    21013924    21014512    3   234 219 1.359224182 19536504    21054539    1.247494175
    chr1    21016588    21016803    3   172 179 1.230421209 19536504    21054539    1.247494175
    chr1    21024895    21025101    3   147 120 1.230421209 19536504    21054539    1.247494175
    chr14   20920169    20920704    3   211 214 1.254261327 20840851    20923828    1.288877208
    chr14   20922716    20922919    3   253 262 1.228396526 20840851    20923828    1.288877208
    chr14   20923634    20923828    3   188 201 1.206226522 20840851    20923828    1.288877208
    chr14   20924141    20924329    2   244 344 0.902299535 20924141    21465086    1.088234038
    chr14   20924787    20925701    2   314 306 1.305351797 20924141    21465086    1.088234038
    chr14   20926636    20926836    2   134 136 1.206226522 20924141    21465086    1.088234038", header = TRUE)
    

    提取第 1、8、9 列不与先前行重复的行:

    DF[!duplicated(DF[, c(1,8,9)]),]
    #     chr exon_start exon_end cnv tumor_DOC control_DOC rationormalized_after_smoothing CNV_start  CNV_end seg_mean
    #1   chr1     762097   762270   3       821         717                       1.4566102    762097  6706109 1.297329
    #3   chr1    7868860  7869039   2        78         119                       1.1233852   7796356  8921423 1.088752
    #7   chr1   21012415 21012609   3        89         135                       1.2304212  19536504 21054539 1.247494
    #11 chr14   20920169 20920704   3       211         214                       1.2542613  20840851 20923828 1.288877
    #14 chr14   20924141 20924329   2       244         344                       0.9022995  20924141 21465086 1.088234
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 2011-04-02
      • 1970-01-01
      • 2021-11-25
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多