我正在尝试使用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 ....
答案 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
整个!(...)
表达式是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"
个案例都排在第一位。