Uniq 但仅在字符串的一部分

Uniq but only on part of the string

我有这样的字符串:

import a.b.c.d.f.Class1
import a.b.g.d.f.Class2
import a.b.h.d.f.Class3
import z.y.x.d.f.Class4
import z.y.x.d.f.Class5
import z.y.x.d.f.Class6

我想获取字符串第一部分的所有唯一出现。更具体地说,直到第三个时期。所以我这样做:

grep "import curam" -hr --include \*.java | sort | gawk -F "." '{print ".""."}' | uniq

这给了我:

  import a.b.c
  import a.b.g
  import a.b.h
  import z.y.x

但是,当第三个周期之前的字符串是唯一的时,我想获得第一次出现的完整字符串。所以,我想得到:

import a.b.c.d.f.Class1
import a.b.g.d.f.Class2
import a.b.h.d.f.Class3
import z.y.x.d.f.Class4

有什么想法吗?

只需跟踪唯一的第二个字段:

awk -F '[ .]' '!uniq[]++' file

也就是说,首先将字段分隔符设置为 space 或点。这样,第二个字段始终是点分隔名称中的第一个单词:

$ awk -F '[ .]' '{print }' file
a
a
a
z
z
z

那么,就看他们第一次出现的时间:

$ awk -F '[ .]' '!uniq[]++' file
import a.b.c.d.f.Class1
import z.y.x.d.f.Class4

There are some subtle variations on the first three tokens between the String so I need to do just [.] Can't do space. I updated the question.

所以如果你有:

import a.b.c.d.f.Class1
import a.b.g.d.f.Class2
import a.b.h.d.f.Class3
import z.y.x.d.f.Class4
import z.y.x.d.f.Class5
import z.y.x.d.f.Class6

然后您需要拆分第二个 . 分隔字段并检查何时重复前三个切片。这可以使用与上述相同的方法来完成,只是使用 split() 然后使用前三个切片来检查唯一性:

$ awk '{split(, a, ".")} !uniq[a[1] a[2] a[3]]++' file
import a.b.c.d.f.Class1
import a.b.g.d.f.Class2
import a.b.h.d.f.Class3
import z.y.x.d.f.Class4