微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除固定宽度文件中的重复项,除了最后一次出现之外,该文件具有多个键列

如何解决删除固定宽度文件中的重复项,除了最后一次出现之外,该文件具有多个键列

我有一个固定宽度的文件,如下所示,其中 1-9 和 18-21 是关键。取决于我试图获取没有重复的输出文件

In File
12345ABCD78.90200ABCD
12345ABCD90.45300ABCD
11111EFGH56.75100ABCD
12345ABCD34.45400ABCD
11111EFGH75.90200ABCD

Out File
12345ABCD34.45400ABCD
11111EFGH75.90200ABCD

我已经尝试使用 awk 如下,但无法获得重复的最后一次出现。任何人都可以提供更多帮助。

awk -v df=Duplicates_File.dat -v of=Output_wdout_Duplicate.dat '
(substr($0,1,18),substr($0,174,3)) in key {
        print > df
        next
}
{       key[substr($0,3)]
        print > of
}' Inputfile

解决方法

请尝试遵循 awk 代码。使用所示样本进行编写和测试。

awk '{arr[substr($0,1,9),substr($0,18,4)]=$0} END{for(i in arr){print arr[i]}}' Input_file

说明: 简单的解释是,创建 arr 索引为第 1 个 9 个字符和第 18 个到第 21 个字符,并在其中包含当前行值;继续做同样的事情,直到整个 Input_file 完成读取。在该程序的 END 块中打印数组的所有元素,基本上只提供最后一次出现的所有元素。



第二种解决方案: 使用 GNU awkFIELDSWIDTH 选项,您可以尝试以下操作。

awk 'BEGIN{FIELDWIDTHS = "9 8 4 *"} {arr[$1,$3]=$0} END{for(i in arr){print arr[i]}}'  Input_file
,

您也可以使用此 gnu sub 解决方案:

awk '{last[gensub(/^(.{9}).{8}(.{4}).*/,"\\1\\2","1")] = $0} END {for (i in last) print last[i]}' file

11111EFGH75.90200ABCD
12345ABCD34.45400ABCD

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。