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
我有这样的字符串:
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