有没有办法通过列'uniq'?

Eno*_*Eno 178 linux sorting shell uniq

我有一个像这样的.csv文件:

stack2@example.com,2009-11-27 01:05:47.893000000,example.net,127.0.0.1
overflow@example.com,2009-11-27 00:58:29.793000000,example.net,255.255.255.0
overflow@example.com,2009-11-27 00:58:29.646465785,example.net,256.255.255.0
...
Run Code Online (Sandbox Code Playgroud)

我必须从文件中删除重复的电子邮件(整行)(即overflow@example.com上面示例中包含的一行).如何uniq仅在字段1上使用(以逗号分隔)?根据man,uniq没有列的选项.

我尝试了一些东西,sort | uniq但它不起作用.

Car*_*icz 305

sort -u -t, -k1,1 file
Run Code Online (Sandbox Code Playgroud)
  • -u 独一无二
  • -t, 所以逗号是分隔符
  • -k1,1 关键领域1

测试结果:

overflow@domain2.com,2009-11-27 00:58:29.793000000,xx3.net,255.255.255.0 
stack2@domain.com,2009-11-27 01:05:47.893000000,xx2.net,127.0.0.1 
Run Code Online (Sandbox Code Playgroud)

  • @hello_there_andy:这在手册(`man sort`)中有解释.它代表开始和停止位置. (16认同)
  • 为什么你需要1 in -k1,1?为什么不只是-k1? (10认同)
  • 如果列包含逗号本身(带引号),则不起作用 (3认同)
  • @CarlSmotricz:我对它进行了测试,它确认了`sort`的联机帮助页:``-u`,`--unique` with`-c`,检查严格排序;没有`-c`,**仅输出平等的第一个**." 因此,它确实是"排序前第一次出现重复". (3认同)
  • 它确实回答了具体问题,但标题并未反映出这一点 - 即“uniq”还有其他选项“sort -u”不适用于 - 例如,简单地报告哪些行是重复的(并且不产生输出)独特的线条)。我想知道为什么“uniq”有一个“--skip-fields=N”选项,但没有选择要比较哪个字段的选项......这似乎是一个显而易见的事情。 (3认同)
  • 这也会改变行的顺序,不是吗? (2认同)

gho*_*g74 96

awk -F"," '!_[$1]++' file
Run Code Online (Sandbox Code Playgroud)
  • -F 设置字段分隔符.
  • $1 是第一个领域.
  • _[val]查找val哈希_(常规变量).
  • ++ 递增,并返回旧值.
  • ! 返回逻辑不.
  • 最后有一个隐含的印刷品.

  • 如果你需要*last*uniq而不是第一个,那么这个awk脚本将有所帮助:`awk -F',''{x [$ 1] = $ 0} END {for(i in x)print x [i]}' file` (7认同)
  • 这还有使线条保持原始顺序的额外好处! (6认同)
  • 这种方法比排序快两倍 (4认同)
  • @eshwar只需在字典索引中添加更多字段!例如,`!_ [$ 1] [$ 2] ++`可用于按前两个字段排序.不过,我的'awk`-fu不够强大,不能在一系列领域独一无二.:( (3认同)

Pra*_*ash 15

要考虑多列.

根据第1列和第3列排序并提供唯一列表:

sort -u -t : -k 1,1 -k 3,3 test.txt
Run Code Online (Sandbox Code Playgroud)
  • -t : 冒号是分隔符
  • -k 1,1 -k 3,3 基于第1列和第3列


Car*_* C. 9

或者如果你想使用uniq:

<mycvs.cvs tr -s ',' ' ' | awk '{print $3" "$2" "$1}' | uniq -c -f2

得到:

1 01:05:47.893000000 2009-11-27 tack2@domain.com
2 00:58:29.793000000 2009-11-27 overflow@domain2.com
1
Run Code Online (Sandbox Code Playgroud)

  • 我想指出一个可能的简化:你可以转储`cat`!不要输入tr,只需让tr使用`<`读取文件.通过`cat`管道是新手使用的常见不必要的并发症.对于大量数据,可能会产生性能影响. (5认同)
  • 很高兴知道.谢谢!(当然这是有道理的,想到"猫"和"懒惰";)) (4认同)

小智 5

如果要保留重复项的最后一个,可以使用

 tac a.csv | sort -u -t, -r -k1,1 |tac
Run Code Online (Sandbox Code Playgroud)

这是我的要求

这里

tac 将逐行反转文件