AWK - 根据正则表达式添加值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWK - 根据正则表达式添加值相关的知识,希望对你有一定的参考价值。

我必须在linux中使用awk添加REGEX返回的数字。

基本上来自这个文件:

123john456:x:98:98::/home/john123:/bin/bash

我必须使用awk添加数字123456。所以结果将是579

到目前为止,我已经做了以下事情:

awk -F ':' '$1 ~ VAR+="/[0-9].*(?=:)/" ; {print VAR}' /etc/passwd

awk -F ':' 'VAR+="/[0-9].*(?=:)/" ; {print VAR}' /etc/passwd

awk -F ':' 'match($1, VAR=/[0-9].*?:/) ; {print VAR}' /etc/passwd

从我所看到的匹配并不支持这一点。

有人有什么想法吗?

更新:它也适用于john123结果 - > 123 123john结果 - > 123

答案
$ awk -F':' '{split($1,t,/[^0-9]+/); print t[1] + t[2]}' file
579

根据您的更新要求:

$ cat file
123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash

$ awk -F':' '{split($1,t,/[^0-9]+/); print t[1] + t[2]}' file
579
123
123
另一答案

用gawk和给出的例子

awk -F ':' '{a=gensub(/[a-zA-Z]+/,"+", "g", $1); print a}' inputFile | bc

会做的。更一般:

awk -F ':' '{a=gensub(/[a-zA-Z]+/,"+", "g", $1); a=gensub(/^+/,"","g",a); a=gensub(/+$/,"","g",a); print a}' inputFile | bc

正则表达式部分用'+'替换所有字母序列(例如,'12johnny34'变为12+34)。最后,这个数学运算由bc评估。 (安全,我删除^++$的前导和尾随'+'唱歌)

另一答案

你可以用

awk -F ':' '{n=split($1, a, /[^0-9]+/); b=0; for (i=1;i<=n;i++) { b += a[i]; }; print b; }' /etc/passwd

online awk demo

s="123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash"
awk -F ':' '{n=split($1, a, /[^0-9]+/); b=0; for (i=1;i<=n;i++) { b += a[i]; }; print b; }' <<< "$s"

输出:

579
123

细节

  • -F ':' - 记录被分成带有:字符的字段
  • n=split($1, a, /[^0-9]+/) - 得到字段1并分成仅数字块,保存a数组中的数字,n var包含这些块的数量
  • b=0 - b将保留金额
  • for (i=1;i<=n;i++) { b += a[i]; } - 迭代a数组并对值求和
  • print b - 打印结果。
另一答案

我使用awk的split()来分隔任何不包含数字的字符串上的第一个字段。

split(string, target_array, [regex], [separator_array]*)

* separator_array需要gawk

$ awk -F: '{split($1, A, /[^0-9]+/, S); print S[1], A[1]+A[2]}' <<EOF
123john456:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash
EOF

john 579
john 123
另一答案

您可以使用[^0-9]+作为字段分隔符,而将:[^ ]* 用作记录分隔符:

awk -F '[^0-9]+' 'BEGIN{RS=":[^
]*
"}{print $1+$2}' /etc/passwd

所以给定/ etc / passwd的内容是:

123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash

这输出:

579
123
123
另一答案

你也可以尝试Perl

$ cat johnny.txt
123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash

$ perl -F: -lane ' $_=$F[0]; $sum+= $1 while(/(d+)/g); print $sum; $sum=0 ' johnny.txt
579
123
123

$
另一答案

这是另一个awk变体,它添加了由:分隔的第一个字段中的所有数字:

cat file
123john456:x:98:98::/home/john123:/bin/bash
john123:x:98:98::/home/john123:/bin/bash
123john:x:98:98::/home/john123:/bin/bash
1j2o3h4n5:x:98:98::/home/john123:/bin/bash

awk -F '[^0-9:]+' '{s=0; for (i=1; i<=NF; i++) {s+=$i; if ($i~/:$/) break} print s}' file

579
123
123
15

以上是关于AWK - 根据正则表达式添加值的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之正则表达式三剑客——awk工具

Shell编程之正则表达式

awk 两个正则表达式条件 - 结构复杂的复杂事务列表 csv

正则表达式中awk使用方法

正则表达式

Shell编程之正则表达式