删除除最后一次出现外具有多个键列的固定宽度文件中的重复项
Removing duplicates in fixed width file which has multiple key columns except the last occurrence
我有一个固定宽度的文件,如下所示,其中 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([=11=], 1, 18),substr([=11=], 174, 3)) in key {
print > df
next
}
{ key[substr([=11=], 1, 18),substr([=11=], 174, 3)]
print > of
}' Inputfile
请尝试以下 awk
代码。使用显示的示例编写和测试。
awk '{arr[substr([=10=],1,9),substr([=10=],18,4)]=[=10=]} END{for(i in arr){print arr[i]}}' Input_file
解释: 简单的解释是,创建索引为第 9 个字符和第 18 到第 21 个字符并具有当前行值的 arr在里面;继续这样做,直到整个 Input_file 完成阅读。在这个程序的 END
块中打印数组的所有元素,这基本上只提供最后一次出现的所有元素。
第二个解决方案: 使用 GNU awk
的 FIELDSWIDTH
选项,您可以尝试以下操作。
awk 'BEGIN{FIELDWIDTHS = "9 8 4 *"} {arr[,]=[=11=]} END{for(i in arr){print arr[i]}}' Input_file
您也可以使用这个gnu sub
解决方案:
awk '{last[gensub(/^(.{9}).{8}(.{4}).*/, "\1\2", "1")] = [=10=]} END {for (i in last) print last[i]}' file
11111EFGH75.90200ABCD
12345ABCD34.45400ABCD
我有一个固定宽度的文件,如下所示,其中 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([=11=], 1, 18),substr([=11=], 174, 3)) in key {
print > df
next
}
{ key[substr([=11=], 1, 18),substr([=11=], 174, 3)]
print > of
}' Inputfile
请尝试以下 awk
代码。使用显示的示例编写和测试。
awk '{arr[substr([=10=],1,9),substr([=10=],18,4)]=[=10=]} END{for(i in arr){print arr[i]}}' Input_file
解释: 简单的解释是,创建索引为第 9 个字符和第 18 到第 21 个字符并具有当前行值的 arr在里面;继续这样做,直到整个 Input_file 完成阅读。在这个程序的 END
块中打印数组的所有元素,这基本上只提供最后一次出现的所有元素。
第二个解决方案: 使用 GNU awk
的 FIELDSWIDTH
选项,您可以尝试以下操作。
awk 'BEGIN{FIELDWIDTHS = "9 8 4 *"} {arr[,]=[=11=]} END{for(i in arr){print arr[i]}}' Input_file
您也可以使用这个gnu sub
解决方案:
awk '{last[gensub(/^(.{9}).{8}(.{4}).*/, "\1\2", "1")] = [=10=]} END {for (i in last) print last[i]}' file
11111EFGH75.90200ABCD
12345ABCD34.45400ABCD