Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用awk仅获取包含精确元素的部分_Bash_Awk - Fatal编程技术网

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明确提到它需要在每个部分之后出现;是的,我的数据在最后两部分之间不包含换行符,但这不会影响逻辑