awk根据字段中的关键字删除特定行中的重复项

时间:2017-05-14 22:43:26

标签: awk

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

文件

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     ....

2 个答案:

答案 0 :(得分:3)

awk -F'\t' '!($2 == "Fusion" && seen[$4]++)' file
  • $2 == "Fusion" && seen[$4]++匹配第二个字段等于Fusion且第四个字段至少见过一次的行。

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

    • 第二个字段等于Fusion
    • 第一个时间正在显示第4个字段值。
  • 整个!(...)表达式是Awk术语中的模式,以及没有关联的操作的模式({ ... } block)默认为打印手头的输入记录
    (暗示行动{ print })。

Ed Morton寻求帮助的提示。

答案 1 :(得分:1)

这似乎对我有用:

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"个案例都排在第一位。