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

awk根据字段中的关键字删除特定行中的重复项,awk,Awk,我试图使用awk删除制表符分隔文件中的重复行,如果它们的$2值为Fusion,并且每行中的$4值相同。在下面的示例中,第1行和第2行具有相同的$2值,其中$4值也相同,因此删除重复的第2行。第3行和第4行也遵循这一逻辑。行的数量可能是可变的,但格式将是相同的。由于第5行和第6行在$2中没有Fusion,因此跳过它们并在输出中打印。谢谢 文件 awk 期望输出 这似乎对我有用: awk -F'\t' '{if($2 == "FUSION")a[$4] = $0; else b[$0]=$0;}EN

我试图使用awk删除制表符分隔文件中的重复行,如果它们的$2值为Fusion,并且每行中的$4值相同。在下面的示例中,第1行和第2行具有相同的$2值,其中$4值也相同,因此删除重复的第2行。第3行和第4行也遵循这一逻辑。行的数量可能是可变的,但格式将是相同的。由于第5行和第6行在$2中没有Fusion,因此跳过它们并在输出中打印。谢谢

文件

awk

期望输出


这似乎对我有用:

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==融合案例都排在第一位。

这似乎对我有效:

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
awk -F'\t' '!($2 == "Fusion" && seen[$4]++)' file
唯一的问题是它重新排序,以便所有$2==融合案例都排在第一位

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

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

第二个字段不等于Fusion 或者第一次看到第四个字段值。 全部!。。。表达式是Awk术语中的一种模式,没有关联动作的模式{…}块默认为打印手头的输入记录 动作{print}是隐含的

向他表示感谢

$2==Fusion&&seen[$4]++匹配第二个字段等于Fusion且第四个字段之前至少出现过一次的行

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

第二个字段不等于Fusion 或者第一次看到第四个字段值。 全部!。。。表达式是Awk术语中的一种模式,没有关联动作的模式{…}块默认为打印手头的输入记录 动作{print}是隐含的


感谢他的帮助。

谢谢大家的帮助和解释:谢谢大家的帮助和解释:
awk -F'\t' '!($2 == "Fusion" && seen[$4]++)' file