-2

我的文件包含如下所示的数据:

{ "any1", "aaa.bbb.ccc.1.ddd", "var1" }
{ "any2", "aaa.bbb.ccc.1.eee", "toto" }
{ "an42", "aaa.bbb.ccc.1.fff", "titi" }
{ "an47", "aaa.bbb.ccc.2.eee", "var3" }
{ "any7", "aaa.bbb.ccc.2.ddd", "var12" }
{ "a789", "aaa.bbb.ccc.2.fff", "var14" }
{ "any1", "xxx.yyy.zzz.1.ddd", "var1" }
{ "any2", "xxx.yyy.zzz.1.eee", "toto" }
{ "an42", "xxx.yyy.zzz.1.fff", "titi" }

我想提取前缀的所有索引"aaa.bbb.ccc"

所以命令应该返回

linux# command
1
2

我怎么能用sed, awk, grep, sort?

4

3 回答 3

4

例如,您可以说:

$ grep -Po '(?<=aaa\.bbb\.ccc\.)\d*' file | sort -u
1
2

一步步

获取后面的数字aaa\.bbb\.ccc\.(注意我们转义点以匹配点本身,而不是任何字符):

$ grep -Po '(?<=aaa\.bbb\.ccc\.)\d*' file
1
1
1
2
2
2

sort它们并找到唯一值:

$ grep -Po '(?<=aaa\.bbb\.ccc\.)\d*' file | sort -u
1
2

替代sed

如果您的 中没有该-P选项grep,您可以使用sed

$ sed -nr 's/^.*aaa\.bbb\.ccc\.([0-9]+).*$/\1/p' file
1
1
1
2
2
2
$ sed -nr 's/^.*aaa\.bbb\.ccc\.([0-9]+).*$/\1/p' file | sort -u
1
2
于 2015-04-30T09:17:03.127 回答
0
sed -n '/.*aaa\.bbb\.ccc\.\([0-9]\{1,\}\).*/ {s//\1/;H;}
   $!d
   s/.*//;H;x
:a
   s/\(\n[^[:cntrl:]]*\)\(.*\)\1\n/\1\2\
/
   ta
   s/.\(.*\)./\1/p' YourFile

为了好玩,在 1 (posix) sed 中,未排序。(GNU sed 允许在线版本)

于 2015-04-30T09:38:10.750 回答
0

另一种awk选择:

$ awk -F\. '/aaa.bbb.ccc.[0-9]+/{b=$(NF-1);if (!(b in a)){ print b}a[b]++}' infile

脚步:

  1. FS分隔符设置为dot
  2. 寻找想要的图案
  3. 将索引值存储在b变量中
  4. 使用关联数组a 来标记打印的索引键。
  5. 如果b不在a打印索引( a 的键)
于 2015-04-30T09:38:31.737 回答