我想知道是否有一种通用的方法可以使用awk方法提取特定的字符串,根据设计,该字符串是11个字符的字母数字字符串?对于前
cat ext.txt
This is a sample field where the code is MGTCBEBEECL for NR
This is a sample field where the code is MGTCBEBEE01 for NR
This field must be 030 when Rule_1 = 'FR' and Rule_2 is 'EUROFRANSBI' or 'EURO_NEAR' and code is PARBFRPPXXX
This field must be 0186 when Rule_1 = 'FR' and Rule_2 is 'EUROFRANSBI' or 'EURO_NEAR' and code is CITIFRPPXXX for the NR
For NFNC with Rule_1 is CA and Rule_2 is Universal and business code is null and official code must be 'CIBCCATTXXX'
我只想提取代码:-
MGTCBEBEECL
MGTCBEBEE01
PARBFRPPXXX
CITIFRPPXXX
CIBCCATTXXX
我希望从近100行这样的行中提取这些不同的字符串,但我不知道如何使其更通用和不多余,因此寻求社区的帮助!
GNU awk
有一种使用FPAT:的方法
awk -v FPAT='[[:alnum:]]{11}' '{print $NF}' file
MGTCBEBEECL
MGTCBEBEE01
PARBFRPPXXX
CITIFRPPXXX
CIBCCATTXXX
- 将FPAT设置为
'[[:alnum:]]{11}'
GNU awk可以处理包含11个字符的字母数字字符串的字段 - 以及用于打印所需字段的CCD_ 3
使用gawk:
gawk -F "[ ']" 'BEGIN{ r=@/[A-Z]{11}/ }r{ for (i=1; i<=NF;i++){ if($i~r) print $i} }' ext.txt
-F "[ ']"
使用空格或'
作为字段分隔符(也可以查找类似'CIBCCATTXXX'
的代码(r=@/[A-Z]{11}/
分配使用过的正则表达式(因为它在脚本中使用了两次for(...
在一行中的所有字段上循环,并在字段与正则表达式匹配时打印该字段
输出:
MGTCBEBEECL
EUROFRANSBI
PARBFRPPXXX
EUROFRANSBI
CITIFRPPXXX
CIBCCATTXXX
使用任何具有-E
的sed来启用ERE,例如GNU和BSD seds:
$ sed -En "s/.*code (is|must be) '?([[:upper:][:digit:]]+).*/2/p" file
MGTCBEBEECL
MGTCBEBEE01
PARBFRPPXXX
CITIFRPPXXX
CIBCCATTXXX
在当前的示例中,您可以使用grep
这样做:
<ext.txt grep -oE "(code is|code must be) '?[A-Z0-9]{11}'?" |
tr -d "'" |
grep -o '[^ ]*$'
输出:
MGTCBEBEECL
MGTCBEBEE01
PARBFRPPXXX
CITIFRPPXXX
CIBCCATTXXX
我们可以使用awk
的match
函数,在GNU中编写和测试awk
应该在任何awk
中工作。简单的解释是使用awk
的match
函数,其中我们可以使用正则表达式[[:alnum:]]{11}
来匹配每行中的11个连续字母数字,如果找到TRUE匹配,则打印匹配值的子字符串。
awk 'match($0,/[[:alnum:]]{11}/){print substr($0,RSTART,RLENGTH)}' Input_file