Awk 如何使用基于图案匹配的剪切线?

Awk 如何使用基于图案匹配的剪切线?,awk,sed,Awk,Sed,我有一个输出如下的文件 --B32934-- descr: X descr: Y descr: Z --B20484 descr: A descr: B descr: C --B41946 descr: 1 descr: 2 descr: 3 descr: 4 我只需要-BXXXX号和第一行,其余的行需要从文件中删除。是否可以根据模式匹配-B删除大于1的行 例如,在-B32934下,我只需要descr:X。其余的行

我有一个输出如下的文件

--B32934--
descr:     X
descr:     Y
descr:     Z
--B20484
descr:     A
descr:     B
descr:     C
--B41946
descr:     1
descr:     2
descr:     3
descr:     4
我只需要-BXXXX号和第一行,其余的行需要从文件中删除。是否可以根据模式匹配-B删除大于1的行

例如,在-B32934下,我只需要descr:X。其余的行需要删除

期望的结果应该是这样的

--B32934--
descr:     X
两种方法:

--B32934--
descr: X
--B20484
descr: A
--B41946
descr: 1
-awk方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file
sed -n '/--B[0-9]*/{N;p;}' file
/^-B[0-9]+/-如果线条以图案开头

r=NR-保留记录编号

NR-1==r-如果是图案线后的下一行

要捕获图案线后的以下两条线,请使用此方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file
sed -n '/--B[0-9]*/{N;p;}' file
-基于GNU的方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file
sed -n '/--B[0-9]*/{N;p;}' file
N-向模式空间添加一个换行符,然后将下一行输入追加到模式空间GNU扩展 两种方法的输出:

--B32934--
descr: X
--B20484
descr: A
--B41946
descr: 1
两种方法:

--B32934--
descr: X
--B20484
descr: A
--B41946
descr: 1
-awk方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file
sed -n '/--B[0-9]*/{N;p;}' file
/^-B[0-9]+/-如果线条以图案开头

r=NR-保留记录编号

NR-1==r-如果是图案线后的下一行

要捕获图案线后的以下两条线,请使用此方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file
sed -n '/--B[0-9]*/{N;p;}' file
-基于GNU的方法:

awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r' file
awk '/^--B[0-9]+/{ r=NR; print }(NR-1)==r || (NR-2)==r' file
sed -n '/--B[0-9]*/{N;p;}' file
N-向模式空间添加一个换行符,然后将下一行输入追加到模式空间GNU扩展 两种方法的输出:

--B32934--
descr: X
--B20484
descr: A
--B41946
descr: 1
您可以使用以下awk命令:

说明:

如果变量p为true,则打印当前行,将p设置回0 false。如果行以a-开头,则打印当前行,并将p设置为1 true,以便打印下一行

您可以使用以下awk命令:

说明:


如果变量p为true,则打印当前行,将p设置回0 false。如果行以a-开头,则打印当前行,并将p设置为1 true,以便打印下一行

这可能适用于GNU-sed:

sed '/^--B\S\+/!d;n' file

删除任何不以-B开头并后跟一个或多个非空格字符的行。否则,请打印该行和以下内容。

这可能适用于GNU用户:

sed '/^--B\S\+/!d;n' file

删除任何不以-B开头并后跟一个或多个非空格字符的行。否则,请打印该行和以下内容。

这里是另一个使用grep的解决方案

grep-e'^-B[0-9]\+'-无组分隔符-A 1文件

产出:

--B32934--
descr:     X
--B20484
descr:     A
--B41946
descr:     1

这是grep的另一个解决方案

grep-e'^-B[0-9]\+'-无组分隔符-A 1文件

产出:

--B32934--
descr:     X
--B20484
descr:     A
--B41946
descr:     1


发布所需的结果。感谢您的回复。所需的结果应该如下-B32934-descr:X-B20484 descr:A-B41946 descr:1将其他信息编辑到问题中。在评论中读起来太难了。请注意,顶部有用于格式化的花式按钮。发布所需结果可能会重复。谢谢您的回复。所需的结果应该如下-B32934-descr:X-B20484 descr:A-B41946 descr:1将其他信息编辑到问题中。在评论中读起来太难了。请注意,顶部有用于格式化的奇特按钮。可能是我的道歉的重复,我有点被sed,当我在我的mac上尝试此操作时,我在sed-n'/-AS[0-9]*/{h;n;p}测试sed:1:/-AS[0-9]*/{h;n;p}下面得到错误:p的末尾有额外字符command@venkyjack,这是GNU-sed。如果是这样,请使用我的awk方法awk命令在我的mac电脑上工作,但仅供参考,您能告诉我$0和B[0-9]的作用吗?谢谢我这样问是因为万一我需要两行,我需要知道需要修改的内容。@RomanPerekhrest只需添加;要结束对两个sed版本的使用。。。如果您正在使用[0-9]*您最好将其删除。。。h也不需要了。。。sed-n'/-B/{n;p;}'。。。也可以使用grep-A1-无组分隔符'\-B',但需要GNUgrep@venkyjack,请参阅我的详细信息我很抱歉,我对sed有点失望,当我在我的mac上尝试此操作时,我在sed-n'/-AS[0-9]*/{h;n;p}测试sed:1:/-AS[0-9]*/{h;n;p}:在p的末尾有额外的字符command@venkyjack,这是GNU-sed。如果是这样,请使用我的awk方法awk命令在我的mac电脑上工作,但仅供参考,您能告诉我$0和B[0-9]的作用吗?谢谢我这样问是因为万一我需要两行,我需要知道需要修改的内容。@RomanPerekhrest只需添加;要结束对两个sed版本的使用。。。如果您正在使用[0-9]*您最好将其删除。。。h也不需要了。。。sed-n'/-B/{n;p;}'。。。也可以使用grep-A1-无组分隔符'\-B',但需要GNUgrep@venkyjack,见我的详细资料谢谢。这也行,但是如果我需要2行而不是1行,我应该修改什么变量?@venkyjack查看所有你可以做的事情。。。awk'/^-/{p=3}p&&p-'将是匹配行和2的一种方法afterwards@Sundeep谢谢,有什么方法可以在每次输出后添加一个空白新行吗?请将输出记录分隔符设置为两个新行:awk'p{print;p=0}/^-/{print;p=1}'ORS='\n\n'file@hek2mgl谢谢,但这在B和描述之间增加了额外的空行:,我只是
每组B和描述之间的需要:例如:-B32934-描述:X描述:Y描述:Z-B20484描述:A描述:B描述:C谢谢。这也行,但是如果我需要2行而不是1行,我应该修改什么变量?@venkyjack查看所有你可以做的事情。。。awk'/^-/{p=3}p&&p-'将是匹配行和2的一种方法afterwards@Sundeep谢谢,有什么方法可以在每次输出后添加一个空白新行吗?请将输出记录分隔符设置为两个新行:awk'p{print;p=0}/^-/{print;p=1}'ORS='\n\n'file@hek2mgl谢谢,但这在B和描述之间增加了额外的空行:,我只需要在每一组B和descr之间添加一个新的空行。例如:-B32934-descr:X descr:Y descr:Z-B20484 descr:A descr:B descr:c谢谢,有没有办法在每次输出后添加一个新的空行?@venkyjack Yep,只需使用grep-e'^-B[0-9]\+'-A 1组分隔符文件谢谢,有没有办法在每次输出后添加一个新的空行?@venkyjack Yep,只需使用grep-e'^-B[0-9]\+'-一个1组分隔符文件