0

我有一个看起来像的文字 -

Application.||dates:[2022-11-12]|models:[MODEL1]|count:1|ids:2320 
Application.||dates:[2022-11-12]|models:[MODEL1]|count:5|ids:2320 

我想要count:1列中的数字,所以1我希望将这些数字存储在一个数组中。

nums=($(echo -n "$grepResult" | awk -F ':' '{ print $4 }' | awk -F '|' '{ print $1 }'))

这似乎非常重复且效率不高,有什么想法可以简化吗?

4

2 回答 2

1

试试 sed

nums=($(sed 's/.*count://;s/|.*//' <<< "$grepResult"))

说明:
有两个用 ; 分隔的 sed 命令 象征。
第一个命令's/.*count://'删除所有字符,直到'count:'包含它。
第二个命令's/|.*//''|'包含它开始删除所有字符。
命令顺序在这里很重要。

于 2022-01-29T20:58:52.930 回答
1

您可以使用一次 awk,将字段分隔符设置为|. 然后循环所有字段并拆分:

如果该字段以开头,count则打印拆分值的第二部分。

这样,该count:部分可以出现在字符串中的任何位置,并且可以多次打印。

nums=($(echo -n "$grepResult" |  awk -F'|' '
{
  for(i=1; i<=NF; i++) {
    split($i, a, ":")
    if (a[1] == "count") {
      print a[2]
    }
  }
}
'))

for i in "${nums[@]}"
do
   echo "$i"
done

输出

1
5

如果要组合两个拆分值,可​​以将[|:]其用作字符类并打印字段编号 8 以进行精确匹配,如注释中所述。

请注意,它不检查它是否以count:

 nums=($(echo -n "$grepResult" |  awk -F '[|:]' '{print $8}'))

您可以使用gnu awk捕获组来获得更精确的匹配,其中左侧和右侧可以是字符串的开始/结束或管道字符。第 2 组匹配 1 个或多个数字:

nums=($(echo -n "$grepResult" | awk 'match($0, /(^|\|)count:([0-9]+)(\||$)/, a) {print a[2]}' ))
于 2022-01-30T16:27:19.070 回答