【问题标题】:awk to remove duplicates in specific lines based on keyword in fieldawk 根据字段中的关键字删除特定行中的重复项
【发布时间】:2017-10-13 15:33:52
【问题描述】:

我正在尝试使用awk 删除tab-delimited 文件中的重复行,如果它们具有$2 值是Fusion 并且相同的$4 值在每一行中。在下面的示例中,第 1 行和第 2 行具有相同的 $2 值,并且 $4 值也相同,因此删除了重复的第 2 行。第 3 行和第 4 行也遵循这个逻辑。行数可能是可变的,但格式将是相同的。由于第 5 行和第 6 行在 $2 中没有 Fusion,因此它们被跳过并打印在输出中。谢谢你:)。

文件

chr12:12006495-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E4N15 1868
chr15:88483984-chr12:12006495 Fusion Gain-of-Function ETV6NTRK3-E4N15 1868
chr12:12022903-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E5N15 414833
chr15:88483984-chr12:12022903 Fusion Gain-of-Function ETV6NTRK3-E5N15 414833
chr10     SNV     ....
chr15     SNV     ....

awk

awk -F'\t' '{if($2 in a)a[$2]=$2=="Fusion"?$0:a[$4];else a[$4]=$0}END{for(i in a)print a[i]}' file

期望的输出

chr12:12006495-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E4N15 1868
chr12:12022903-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E5N15 414833
chr10     SNV     ....
chr15     SNV     ....

【问题讨论】:

    标签: awk


    【解决方案1】:
    awk -F'\t' '!($2 == "Fusion" && seen[$4]++)' file
    
    • $2 == "Fusion" && seen[$4]++ 匹配第 2 个字段等于 Fusion 且第 4 个字段之前至少出现过一次的行。

      • seen[$4]++ 是一个常见的 Awk 习惯用法,它通过按需添加条目并记录每个值的出现次数来增量构建字段值的关联数组。 post-减量 (...++) 确保在 第一次 次遇到给定值时,seen[$4]++ 评估为(概念上的)false ,而所有后续出现都暗示 true
    • !(...) 否定逻辑,仅在以下情况下评估为(概念上的)true

      • 第二个字段等于Fusion
      • 第 4 个字段值第 次出现。
    • 整个!(...) 表达式是Awk 术语中的模式,并且没有关联动作{ ... } 块)的模式默认为打印手头的输入记录
      (隐含动作{ print })。

    Ed Morton 致敬以寻求帮助。

    【讨论】:

      【解决方案2】:

      这似乎对我有用:

      awk -F'\t' '{if($2 == "FUSION")a[$4] = $0; else b[$0]=$0;}END{for(k in a)print a[k];for(l in b)print b[l];}' file
      

      唯一的问题是它会重新排序,以便所有 $2 == "FUSION" 案例都排在第一位。

      【讨论】:

      • 谢谢大家的帮助和解释:)
      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 2015-04-20
      • 1970-01-01
      • 2021-07-04
      • 2019-06-23
      • 2016-02-21
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多