我有以下字符串:
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
有什么想法吗?
答案 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