如何从字符串中提取索引?
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
如何使用 sed
、awk
、grep
、sort
?
例如你可以说:
$ 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
步骤:
- 将
FS
分隔符设置为 dot
- 寻找想要的图案
- 将索引值存储在
b
变量中
- 使用关联数组
a
标记打印的索引键。
- 如果
b
不在a
中打印索引(a的键)
我的文件包含如下所示的数据:
{ "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
如何使用 sed
、awk
、grep
、sort
?
例如你可以说:
$ 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
步骤:
- 将
FS
分隔符设置为dot
- 寻找想要的图案
- 将索引值存储在
b
变量中 - 使用关联数组
a
标记打印的索引键。 - 如果
b
不在a
中打印索引(a的键)