Bash 如何使用awk仅获取包含精确元素的部分
我正在尝试进行一些文本处理,但无法解决,问题是: 我有一个如下所示的文件:Bash 如何使用awk仅获取包含精确元素的部分,bash,awk,Bash,Awk,我正在尝试进行一些文本处理,但无法解决,问题是: 我有一个如下所示的文件: ORANGE{ a b c CI 123 d e f g } APPLE{ 1 2 3 4 5 CI 123 6 7 } ORANGE{ A B C CI 321 D E } ORANGE{ hell CI 123 ABCD 1234 hmmm } awk'/ORANGE{/{sho=1};/^CI 123$/{sho=1};/^}$/{sho=0}sho'文件 我
ORANGE{
a
b
c
CI 123
d
e
f
g
}
APPLE{
1
2
3
4
5
CI 123
6
7
}
ORANGE{
A
B
C
CI 321
D
E
}
ORANGE{
hell
CI 123
ABCD 1234
hmmm
}
awk'/ORANGE{/{sho=1};/^CI 123$/{sho=1};/^}$/{sho=0}sho'文件
我尝试了上面的代码,但它并没有给出我想要的,而是给出了所有的橙色部分。
我在谷歌上搜索了很多地方,但没有找到任何相关信息。谢谢
$ cat temp
ORANGE{
...
CI 123
...
}
APPLE{
...
CI 123
...
}
ORANGE{
...
CI 321
...
}
ORANGE{
...
CI 123
ABCD 1234
...
}
$ awk '/ORANGE/ {o=1;p=0} {if(o)arr[i++]=$0} /CI 123/ {if(o){for(key in arr) print arr[key];p=1}else{p=0} delete arr;i=0;next;} /}/ {if(p)print;p=0;delete arr;i=0;o=0;} o && p' temp
ORANGE{
...
CI 123
...
}
ORANGE{
...
CI 123
ABCD 1234
...
}
下面是脚本文件中相同的awk
逻辑,具有相当的标识:
/ORANGE/ {
o=1
p=0
}
{
if(o)
arr[i++]=$0
}
/CI 123/ {
if(o)
{
for(key in arr)
print arr[key]
p=1
}
else
p=0
delete arr
i=0
next
}
/}/ {
if(p)
print
p=0
delete arr
i=0
o=0
}
o && p
我们可以将这样的脚本文件与awk
一起使用:
$ awk -f script.awk temp
ORANGE{
...
CI 123
...
}
ORANGE{
...
CI 123
ABCD 1234
...
}
Edit1:自定义数据
$ cat temp
ORANGE{
a
b
c
CI 123
d
e
f
g
}
APPLE{
1
2
3
4
5
CI 123
6
7
}
ORANGE{
A
B
C
CI 321
D
E
}
ORANGE{
hell
CI 123
ABCD 1234
hmmm
}
$ awk '/ORANGE/ {o=1;p=0} {if(o)arr[i++]=$0} /CI 123/ {if(o){for(key in arr) print arr[key];p=1}else{p=0} delete arr;i=0;next;} /}/ {if(p)print;p=0;delete arr;i=0;o=0;} o && p' temp
ORANGE{
a
b
c
CI 123
d
e
f
g
}
ORANGE{
hell
CI 123
ABCD 1234
hmmm
}
awk是您在这里的朋友:
awk 'BEGIN{RS="}\n*";ORS="}\n";}/ORANGE.*CI 123\n/{print}' file
在这里,您将}\n
设置为输入/输出记录分隔符并搜索模式:
ORANGE(anything)CI 123(newline)
在每个记录中,如果找到,则打印该记录
$ awk -v RS="" '/ORANGE/&&/CI 123/' file
ORANGE{
...
CI 123
...
}
将AWK记录分隔符RS设置为空字符串将使每个块成为一条记录。然后用AWK搜索你想要的2个字符串。如果有多个
ORANGE{..CI 123..}
,你的字符串将不起作用,请参阅下面我的临时文件的数据。这对我来说是行不通的that@ritesht93:更正了该问题。您的新代码占用了我数据中的第一个橙色{..}
。它只输出<代码>橙色{…CI 123 ABCD 1234…}嗨,谢谢你的帮助。我刚刚在我的纸条中尝试了你的代码,但我的前几行被替换了,其余的都很好。:@Eason你的问题解决了吗?如果不是。。你能发布你正在使用的样本数据吗?好的,我使用了你的awk,我得到的输出是这样的:bcci123 ORANGE{a d e f g}ci123 ORANGE{hell ABCD 1234 hmmm}
交换的前几行。@Eason不,我不能重现你说的话。它非常适合我,也编辑了答案。请用@ritesht93的答案中给出的测试模式进行检查。@ritesht93:op发布的原始样本数据包含一个分隔各部分的空行。您的示例数据不包含这些。请确实与OP确认这一点。@sjsam理想情况下,我认为换行是可选的,除非OP明确提到它需要在每个部分之后出现;是的,我的数据在最后两部分之间不包含换行符,但这不会影响逻辑