Linux 中是否有按列“uniq”的方法?
简介
在 Linux 操作系统中,“uniq” 命令用于从已排序的文件中删除重复行。但是,有时您可能需要根据特定列而不是整行来删除重复项。当处理基于列的输入文件(例如 CSV 文件)时,这将变得特别有用。在本文中,我们将探讨在 Linux 上执行此类按列“uniq”的几种方法。
方法 1:使用 sort 命令
sort 命令是一种简单有效的方法,可以按特定字段对行进行排序并从排序结果中删除重复项。对于重复项,只会保留第一个实例。在本节中,我们将探讨如何使用 sort 命令解决删除特定列中重复条目的问题。
使用 tail 命令删除标题行 -
$ tail -n+2 price.csv | sort -u -t, -k1,1 Keybord,20,2019-02-02 Monitor,218,2019-01-01 Wireless Mouse,25,2019-02-02
前面的命令使用 tail 命令删除文件的首行(通常是标题行),并将文件的其余部分路由到 sort 命令。然后,sort 命令用于对行进行排序并使用 -u 选项删除重复项。“-t”选项用于将字段分隔符设置为逗号,“-k1,1”选项用于按第一列排序。
在输出中保留标题行 -
$ head -n1 price.csv && tail -n+2 price.csv | sort -u -t, -k1,1 Product,Price,Update Keybord,20,2019-02-02 Monitor,218,2019-01-01 Wireless Mouse,25,2019-02-02
此命令与前一个命令类似,但使用 head 命令打印文件的首行(通常是标题行),然后使用 tail 命令删除标题行并对文件的其余部分进行排序。
方法 2:使用 awk 命令
执行按列“uniq”操作的另一种方法是使用 awk 命令。Awk 是一种功能强大的文字处理工具,可用于选择和操作文件中的特定列。对于按列“uniq”,我们可以使用以下命令 -
$ awk -F, 'NR==1 || !a[$1]++' price.csv Product,Price,Update Monitor,218,2019-01-01 Keybord,20,2019-02-02 Wireless Mouse,25,2019-02-02
以上命令使用 awk 命令使用“-F”选项将字段分隔符设置为逗号。表达式“NR==1”用于处理标题行,该行将打印在输出中。表达式“!a[$1]++”用于通过为第一列中的每个唯一条目创建关联数组元素并忽略任何重复项来删除第一列中的重复条目。
方法 3:使用带 -f 选项的 uniq 命令
在 Linux 上按列“uniq”的第三种方法是使用带“-f”选项的 uniq 命令。“-f”选项可用于在比较行之前忽略指定的字段数。对于按列“uniq”,我们可以使用以下命令 -
$ sort file.txt | uniq -f 0
此命令将对文件“file.txt”进行排序,然后使用带“-f”选项的 uniq 命令在比较行之前忽略第一个字段(列)。这样,uniq 命令在删除重复项时只会考虑第二个及后续字段,从而有效地按列“uniqing”。
结论
在本文中,我们讨论了在 Linux 上执行按列 uniqing 的三种不同方法。第一种方法使用 sort 命令,第二种方法使用 awk 命令,第三种方法使用带“-f”选项的 uniq 命令。每种方法都可用于选择和删除文件特定列中的重复值。方法的选择将取决于业务的具体需求和用户偏好。需要注意的是,此处讨论的所有方法都需要对输入文件进行排序,因此建议您在使用任何这些命令之前对文件进行排序。还需要提及的是,这里的所有示例都使用逗号作为字段分隔符,如果您的文件使用其他分隔符,请相应地调整命令。