大家,我有一个包含一些列的文件。我想对第 2 列进行排序,然后对第 1 列应用 uniq。我发现这篇文章谈论的是同一列的排序和 uniq,但我的问题有点不同。我正在考虑使用某些东西sort
,uniq
但不知道如何使用。谢谢。
问问题
17877 次
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 应用于第一列!)。很酷,要做到这一点,您需要执行三个任务:
- 对将要应用 uniq 的列进行排序(因为 uniq 只能对已排序的输入起作用)。
- 在排好序的列上应用 uniq。
- 根据第二列中的值对输出进行排序。
使用管道:命令是
sort -t ',' -k1 fileName| awk '!x[$1]++' | sort -t ',' -k2
注意uniq中不能指定第一个字段,可以使用-f
switch跳转第一个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 回答