比较第一个模式和特殊模式后删除重复行

比较第一个模式和特殊模式后删除重复行

我正在寻找在比较第一个制表符分隔模式后删除重复行的代码:

示例:( = 选项卡)

car ↦ ab ↦ 38/43
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
house ↦ d ↦ 2/3
house ↦ ht ↦ 3/7
boat ↦ as ↦ 5/5

我想删除重复的行,但限制是ca不应删除第二个字段中的行。

结果:

car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5

有任何想法吗?我尝试了 sed 和 sort,但没有得到任何工作代码。

答案1

我假设如果有重复的条目,总会有一个ca作为第二个字段。

在您的示例数据中,具有相同第一个字段的所有行都分组在一起,但您没有提到情况是否总是如此。如果是,那么任务会稍微简单一些,但即使匹配的行没有组合在一起,下面的 awk 脚本也可以工作。

去重文件

#!/usr/bin/awk -f

{
    if (!($1 in lines) || ($2 == "ca"))
        lines[$1] = $0
}

END{
    for (i in lines) 
        print lines[i]
}

如果输入文件被称为data,您将像这样运行它:

awk -f dedup.awk data

或者

awk -F '\t' -f dedup.awk data

确保它使用制表符作为字段分隔符;默认字段分隔符是一个或多个空格和/或制表符。请Fields参阅 gawk 手册页以获取更多信息。

由于 awk 数组的工作方式,输出数据的顺序可能与源数据不同。可以使用稍微复杂的程序保留原始顺序,或者可以使用 awk 的排序函数之一对输出进行排序,但使用 bash sort 命令可能更灵活。

如果需要,可以压缩该 awk 脚本:

awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data

相关内容