Bash 脚本迭代文件中的记录并根据条件提取值

Bash 脚本迭代文件中的记录并根据条件提取值

感谢以下查询是否有任何帮助。需要 bash 脚本。我对这种脚本技术很陌生。

我在某个位置有以下文件 - 假设文件名为 MemberFile.txt。

#
[ID          ]  #1
[ADDRE1      ]  Address Line #1
[ADDRE2      ]  Mumbai City
[ADDRE3      ]  India
#
[ID          ]  #2
[ADDRE1      ]  House No 2
[ADDRE3      ]  Green Society
[ADDRE4      ]  Kolkatta
#
[ID          ]  #3
[ADDRE1      ]  Plot Num 77
[ADDRE2      ]  House No # [567]
[ADDRE3      ]  greener Apt
#

文件可以有数百万条这样的记录。我想快速迭代每条记录并获取并存储[ADDRE3 ].另请检查该记录是否包含单词“society”或“Num”(不区分大小写)。如果是,则获取[ID ]该记录中标签的值。

预期输出是#2 和#3。

请注意,下面的 1 代表一条记录。

[ID          ]  #1
[ADDRE1      ]  Address Line #1
[ADDRE2      ]  Mumbai City
[ADDRE3      ]  India

答案1

awk解决方案:

awk -v IGNORECASE=1 '/\[ID /{ r=$3; c=3; next }c-- && $0~/society/{ print r }' MemberFile.txt

输出:

#2
#3

  • IGNORECASE=1- 设置不区分大小写的比较模式

  • /\[ID /{ r=$3; c=3; next }- 捕获ID记录号#<number>(作为第三个字段)

  • c-- && $0~/society/- 检查以下3条记录中是否包含society单词

答案2

这可以解决问题:

grep -iE '(^\[ADDRE3.*society|^\[ADDRE3.*no|^\[ADDRE3.*blabla)' -B 3 MemberFile.txt | grep "ID" | grep -o "#[0-9]*"

写下到底发生了什么:

因此,我们在以“[ADDRE3”开头的每一行之后-i使用正则表达式过滤不区分大小写的内容,中间有任意数量的文本,直到我们达到所需的名称或其他内容。-E^\[ADDRE3.*society|

如果命中,我们会显示该行 +-B 3其上方的 3 行。

然后我们过滤所有行的 ID,然后在仅显示的 #Number 之后过滤这些 ID-o

搜索任何地址:

grep -iE '(^\[ADDRE.*society|^\[ADDRE.*no|^\[ADDRE.*blabla)' -B 3 MemberFile.txt | grep "ID" | grep -o "#[0-9]*"

答案3

perl -lne '
   next unless /^#$/ && !$flag ... /^#$/ && $flag;
   $flag++,next if /^#$/ && !$flag;
   /^\[ID\h/ and $id = s/.*\h#/#/r,next;
   push @A, $_;
   if ( (/^#$/ && $flag) ) {
      print $id if join($/, splice(@A,0,@A)) =~ /(?:^|\h)(?i:society|num)(?:\h|$)/m;
      $flag = 0; undef $id; redo;
   }
' MemberFile.txt

在职的

每条记录均以 # 开头(标志为 OFF),以 # 结尾(标志为 ON)。遇到新记录时采取的第一个操作是打开标志。(就像进入房间时打开灯一样)。

当遇到记录中的 ID 行时,保存它的值。对于记录中的所有其他行,将每行保存到数组中@A

到达记录的最后一行(/#/,标志为 ON)时,打印 id,前提是在使用换行符时已知数组元素包含单词“society”或“num”。请注意,splice清空数组。

我们关闭该标志(就像退出房间时应该做的那样),而redo不是next因为它是同一行,所以我们将蚕食下一条记录的开头。

我们几乎使用相同的方法使用sed,但由于它没有数组,我们利用保留空间来实现存储目的。请注意,此代码符合 POSIX 标准,使用 GNU sed-isms 可以将其压缩很多。

sed -e '
   /^\[ID[[:blank:]]/,/^#$/!d
   H;/^\[ID[[:blank:]]/h;/^#$/!d
   g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
   /[[:blank:]]num$/ba
   /[[:blank:]]society$/ba
   /[[:blank:]]num\n/ba
   /[[:blank:]]society\n/ba
   /[[:blank:]]num[[:blank:]]/ba
   /[[:blank:]]society[[:blank:]]/ba
   d;:a
   s/\n.*//
   s/^\[id[[:blank:]].*#/#/
' MemberFile.txt

结果

#2
#3

相关内容