2011-06-10 133 views

回答

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 

难道你期待什么?否则,我不明白:-)

+2

感谢布鲁斯的回答。嗯......但我的情况下需要先排序然后uniq。这意味着第一列可能有重复的值,但不能彼此相邻。还有什么想法?我是awk的初学者,但是如果你有一个好的解决方案。我想用它。谢谢。 – Ken 2011-06-10 05:26:08

+0

您能否提供数据样本和预期结果,例如:在http://pastebin.com上?我不确定我是否完全明白 – Bruce 2011-06-10 05:31:33

+0

酷......这一个适合我......虽然它没有足够强大的非连续列。它会为我目前的任务做。感谢堆。 – Ken 2011-06-10 05:40:55

0

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

你可能想尝试

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

谢谢Lobo ..但我需要先进行排序然后找到第一列中可能存在重复值的第一列中的唯一值,但它们不会紧挨着每一列其他。我很惊讶Linux中的uniq命令没有指定特定列的参数。谢谢。 – Ken 2011-06-10 05:30:10

+0

'uniq'命令可以给你选择字段的选项。看看'-f','s'和其他选项。你在寻找'sort -t''-k2,2 b | uniq -f1'?你能提供一个你正在寻找的输入和输出的例子吗? – Lobo 2011-06-10 05:40:36

+0

,但'-f'和'-s'将跳过第一个数字的列/字符以进行唯一性比较。他们不允许特定的列。布鲁斯的第二个答案现在适用于我目前的任务。谢谢。 – Ken 2011-06-10 05:48:56

0

只是可以肯定的是我得到了你的意思是正确的。您想基于文件中的第二列对文件进行排序。然后你想删除第一列中的重复项(另一种说法是将uniq应用于第一列!)。冷静,要做到这一点,你需要执行三项任务:

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

使用管道:该命令

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

请注意,你不能在指定的uniq第一场,你可以使用-f开关跳第一n领域。因此,我用awk来代替uniq

+0

你能解释一下awk命令吗? – 2018-03-06 16:45:45

0

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

这里排序

1,2 
2,5 
3,1 

to 

3,1 
1,2 
2,5