如何基于列排序,但基于另一列的uniq?

时间:2011-06-10 04:36:17

标签: linux sorting uniq

他全部,   我有一个包含一些列的文件。我想对第2列进行排序,然后对第1列应用uniq。我发现这个post正在讨论同一列的sort和uniq,但我的问题有点不同。我正在考虑使用sortuniq但不知道如何使用。感谢。

4 个答案:

答案 0 :(得分:7)

您可以使用管道,但它不到位。

示例:

$ cat initial.txt
1,3,4
2,3,1
1,2,3
2,3,4
1,4,1
3,1,3
4,2,4

$ cat initial.txt | sort -u -t, -k1,1 | sort -t, -k2,2
3,1,3
4,2,4
1,3,4
2,3,1

结果按键2排序,按键1唯一。注意结果显示在控制台上,如果您想在文件中使用,只需使用重定向(> newFiletxt

此类更复杂操作的其他解决方案是依赖其他工具(取决于您的偏好(和年龄),awk,perl或python)

修改: 如果我理解正确的新要求,它按字母2排序,第1列对于给定的列2是唯一的:

$ cat initial.txt | sort -u -t, -k1,2 | sort -t, -k2,2
3,1,3
1,2,3
4,2,4
1,3,4
2,3,1
1,4,1

这是你所期望的吗?否则,我不明白: - )

答案 1 :(得分:0)

uniq需要数据按排序顺序才能正常工作,因此,如果您在第二个字段上sort,然后在第一个字段上应用uniq,则无法获得正确的结果。

您可能想尝试

sort  -u -t,  -k1,1 filename | sort -t, -k2,2

答案 2 :(得分:0)

只是为了确保我明白你的意思。您希望根据文件中的第二列对文件进行排序。然后你想从第一列中删除重复项(另一种说法是将uniq应用于第一列!)。很酷,要做到这一点,你需要执行三项任务:

  1. 对要应用uniq的列进行排序(因为uniq可以 仅适用于已排序的输入。)
  2. 在排序列上应用uniq。
  3. 根据第二列中的值对输出进行排序。
  4. 使用管道:命令是

     sort -t ',' -k1  fileName| awk '!x[$1]++' | sort -t ',' -k2
    

    请注意,您无法在uniq中指定第一个字段,您可以使用-f开关跳转第一个n字段。因此,我使用awk替换uniq

答案 3 :(得分:0)

我用过这个                   sort -t ',' -nk2

这里排序

1,2
2,5
3,1

to

3,1
1,2
2,5