如何从字符串中提取索引?

How to extract indexes from strings?

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

{ "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"

的所有索引

所以命令应该return

linux# command
1
2

如何使用 sedawkgrepsort

例如你可以说:

$ 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

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

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

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

一个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的键)