7

大家,我有一个包含一些列的文件。我想对第 2 列进行排序,然后对第 1 列应用 uniq。我发现这篇文章谈论的是同一列的排序和 uniq,但我的问题有点不同。我正在考虑使用某些东西sortuniq但不知道如何使用。谢谢。

4

4 回答 4

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

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

于 2011-06-10T05:19:49.090 回答
0

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

你可能想试试

sort  -u -t,  -k1,1 filename | sort -t, -k2,2
于 2011-06-10T05:21:58.220 回答
0

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

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

使用管道:命令是

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

注意uniq中不能指定第一个字段,可以使用-fswitch跳转第一个n字段。因此,我曾经awk更换uniq.

于 2012-06-12T14:45:15.750 回答
0

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

这里排序

1,2
2,5
3,1

to

3,1
1,2
2,5
于 2013-09-25T17:00:58.810 回答