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

Posted

技术标签:

【中文标题】删除固定宽度文件中的重复项,该文件除最后一次出现外具有多个键列【英文标题】:Removing duplicates in fixed width file which has multiple key columns except the last occurrence 【发布时间】:2021-09-17 22:03:04 【问题描述】:

我有一个固定宽度的文件,如下所示,其中 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, 1, 18),substr($0, 174, 3)]
        print > of
' Inputfile

【问题讨论】:

【参考方案1】:

请尝试关注awk 代码。使用所示示例编写和测试。

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

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



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

awk 'BEGINFIELDWIDTHS = "9 8 4 *" arr[$1,$3]=$0 ENDfor(i in arr)print arr[i]'  Input_file

【讨论】:

【参考方案2】:

您也可以使用这个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

【讨论】:

以上是关于删除固定宽度文件中的重复项,该文件除最后一次出现外具有多个键列的主要内容,如果未能解决你的问题,请参考以下文章

模式匹配并删除除最后一次出现的所有行

力扣 练习2(十题)

力扣 练习2(十题)

力扣 练习2(十题)

Pyspark - 从数据框中删除重复项,保持最后一次出现

删除排序数组中的重复数组——移除元素