AWK - 根据正则表达式添加值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWK - 根据正则表达式添加值相关的知识,希望对你有一定的参考价值。
我必须在linux中使用awk添加REGEX返回的数字。
基本上来自这个文件:
123john456:x:98:98::/home/john123:/bin/bash
我必须使用awk添加数字123
和456
。所以结果将是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
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 - 根据正则表达式添加值的主要内容,如果未能解决你的问题,请参考以下文章