如何基于列进行sorting,而基于另一列的uniq?

他所有的,我有一个文件有一些列。 我想对第2列进行sorting,然后对第1列应用uniq。我发现这篇文章讨论sort和uniq的同一列,但是我的问题有点不同。 我正在考虑使用sortuniq东西,但不知道如何。 谢谢。

你可以使用管道,但是它没有到​​位。

例如:

 $ 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)

编辑 :如果我正确理解了新的要求,它按colum 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 

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

uniq需要数据按排序顺序工作,所以如果你在第二个字段sort ,然后在第一个字段上应用uniq ,你将得不到正确的结果。

你可能想尝试

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

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

  1. 对将要应用uniq的列进行排序(因为uniq只能在已排序的输入上工作)。
  2. 在排序的列上应用uniq。
  3. 根据第二列中的值对输出进行排序。

使用管道:命令是

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

请注意,您不能指定uniq中的第一个字段,您可以使用-f开关跳转前n字段。 因此,我用awk来取代uniq

我用这种sort -t ',' -nk2

这里排序

 1,2 2,5 3,1 to 3,1 1,2 2,5