【发布时间】:2020-11-03 14:07:05
【问题描述】:
我想在相同的字段位置表征具有相同字段但字段值不同的行,相同并且仅选择一行。
输入示例
让字段分隔符为“/”
1. abc/def/gh/ij/kl
2. abc/def/gh/ij/yi
3. abc/def/gh/ij/ti
4 abc/def/gh/hk/kl/oi/uh
5. abc/def/gh/ol/kl/oi/uh
6. abc/def/gh/er/kl/oi/uh
7. abc/def/gh/er/kl
将第 1,2,3 行视为相同,仅选择 1 行,即使它们的第 5 个字段的值不同,但它们与其他字段的值相同,并且具有相等的字段。
将第 4,5,6 行视为相同,仅从中选择 1 行,即使它们的第 4 个字段的值不同,但它们与其他字段的值相同,并且具有相等的字段。
第 6 行和第 7 行不一样,因为它们的字段数不相等。
期望的输出
abc/def/gh/ij/kl
abc/def/gh/hk/kl/oi/uh
注意 : 该列表有不同字段编号的行。
我试过sort -u,但显然没有用,因为排序不使用分隔符。 awk 能做到吗?
【问题讨论】:
-
1.2.是输入文件的一部分吗?步骤: 1. 使用sed或awk对文件进行预处理以提取您要排序的部分。 2. 对此进行排序 3. 将所有应该唯一的内容放在第二列中。 4.uniq -f15. 删除第二列。Can awk achieve this?是的,你试过什么? -
@Trendingmike:
sort有选项-t,您可以使用它指定字段分隔符,还有选项-k,您可以使用它指定要使用的字段。如果您不想保留任意一个重复行,而是始终保留第一行,请查看选项-s。 -
@Trendingmike :如果您真的想要坚持使用 bash 和排序,请使用称为 Schwartzian transform 的方法。您首先创建一个新文件,其中包含一个包含唯一标识您的 unqueness 的键的附加字段,然后按此键排序,最后在已排序的文件中删除此字段。在任何情况下,您都需要提供两行何时相等的定义;到目前为止,您只发布了示例。
-
这三行应该发生什么:
a/b/cz/b/cz/x/c? -
@EdMorton:那是个错误,我已经纠正了。感谢您发现它。