![比较第一个模式和特殊模式后删除重复行](https://linux22.com/image/59652/%E6%AF%94%E8%BE%83%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%A8%A1%E5%BC%8F%E5%92%8C%E7%89%B9%E6%AE%8A%E6%A8%A1%E5%BC%8F%E5%90%8E%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E8%A1%8C.png)
我正在寻找在比较第一个制表符分隔模式后删除重复行的代码:
示例:( ↦
= 选项卡)
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