感谢以下查询是否有任何帮助。需要 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