Grep/Awk/Sed 用于“0010|”中的一组行 到“0070|” 在 $PH_NO 中包含匹配项的 AND
下面是样本数据。我需要对 0012 字段中出现的电话号码和相应的完整客户记录进行 grep,从 0010 到 0070 行。一个数据文件可能包含两个或三个具有相同电话号码的客户记录,我需要获取所有这些记录。
0010|Kumar||57 Rich street|Chennai|Tamil Nadu|
0011|20171115| ID
0012|149 196 222| PH Number
0013|20161101|20171102|
0022|Payment Method |Lucky customer|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|TP|10.00-|||
0070|000AYDCHDFF|820|762|
0010|RAM||57 Rich street|Chennai|Tamil Nadu|
0011|20171115| ID
0012|149 196 333| PH Number
0013|20161101|20171102|
0022|Payment Method |Lucky customer|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|TP|10.00-|||
0070|000AYDCHDFF|820|762|
0010|Joe||57 Rich street|Chennai|Tamil Nadu|
0011|20171115| ID
0012|149 196 222| PH Number
0013|20161101|20171102|
0022|Payment Method |Lucky customer|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|P|5.00-|20161111|Payment|
0080|P|5.00-|20161130|Payment|
0080|TP|10.00-|||
0070|000AYDCHDFF|820|762|
注意:我在带有 ksh 的 AIX 服务器上。
所以你想要从 0010 到 0070 的整个记录,如果 PH 号码匹配
$PH_NO"
?然后这个sed
oneliner 将起作用:/^0010/,/^0070/H
将一条从 0010 到 0070 的记录附加到保留空间/^0010/h
0010 不应该被附加,而是开始一个新记录,所以将它复制到保留空间/^0070/! d
除非是 0070 项目,否则不会进一步处理或输出x;/|$PH_NO| PH Number/! d"
交换空格,因此整个记录现在都在模式空间中,如果它不包含所述数字,则将其删除。149 196 222
上面的命令是客户电话号码。将其更改为您要查找的电话号码。CUSTOMER_FILE
是您要搜索的文件。将其更改为您的文件名。您还可以将代码放在 bash 脚本中,并替换
149 196 222
为$1
和替换CUSTOMER_FILE
为$2
. 说find-customer.sh,然后你可以像这样执行脚本./find-customer.sh '149 196 222' your-file-name
这段代码的先决条件:
0010 ... <no 0010 or 0012 or 0070> ... 0012 ... <no 0010 or 0012 or 0070> ... 0070 ... <repeated content as above or end of file>
更新
这是一个高性能版本。(至少比上面的原始更高。根本不涉及 for 循环。)
AIX 更新
由于提问者正在 AIX 上工作。AIX 上的 grep 不支持上下文选项 -A、-B、-C。
在 Internet 上,有多种“cgrep”(上下文 grep)实现来解决这个问题(模拟 GNU grep 上下文选项)。但是它们中的大多数不能提供与 GNU grep 相同的输出。我发现只有一个最接近 GNU grep 上下文选项。链接是https://stackoverflow.com/questions/1685678/advanced-grep-unix/1685782#1685782
我为这个案例做了一些必要的修改。
将此文件另存为并在我上面的命令中
grep-context.sh
替换grep -C1
为。./grep-context.sh 1
我认为一劳永逸的另一种方法是在 AIX 上编译 GNU grep。(也编译 GNU sed 以防万一)
您可以使用此脚本:
将其放入文件并使用此命令添加执行权限
START 变量:您的起始行号(例如 0010)
END 变量:您的结束变量(例如 0070)
MATCH 变量:您在一行中查找的单词/字符/数字(例如 0012)
RSTART 变量:文本文件中的起始行号(例如 1)
REND 变量:文本文件中的起始行号(例如 32)
编辑:
您还可以通过将最后一行更改为以下内容来查看一行重复了多少次: