Uniq但仅限于部分字符串

时间:2016-07-29 09:39:38

标签: linux unix cygwin

我有以下字符串:

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

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

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

给了我:

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

但是,我希望在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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

即,首先将字段分隔符设置为空格或点。这样,第二个字段始终是以点分隔的名称中的第一个字:

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

然后,只检查它们第一次出现的时间:

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

前三个令牌之间有一些微妙的变化   字符串所以我需要做[。]不能做空间。我更新了   问题

所以如果你有:

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

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

$ awk '{split($2, 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