如何使用awk从文件的每一行中只提取特定的字符串



我想知道是否有一种通用的方法可以使用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

我们可以使用awkmatch函数,在GNU中编写和测试awk应该在任何awk中工作。简单的解释是使用awkmatch函数,其中我们可以使用正则表达式[[:alnum:]]{11}来匹配每行中的11个连续字母数字,如果找到TRUE匹配,则打印匹配值的子字符串。

awk  'match($0,/[[:alnum:]]{11}/){print substr($0,RSTART,RLENGTH)}' Input_file

相关内容

  • 没有找到相关文章

最新更新