选择两个相等字符串后的文本

时间:2014-07-01 07:36:01

标签: bash awk sed

我需要从像这样的文本文件中创建

CPRISM_{2}  

CPRISM_{2} top_material, bottom_material, side_material,  
n, h,  
x1, y1. alpha1, s1, mat1, 
... 
xn, yn, alphan, sn, matn 

junk junk junkkkkk
dawda
...

BPRISM_ 

BPRISM_ top_material, bottom_material, side_material,
n, h, radius, x1, y1, s1, ... xn, yn, sn

这个

CPRISM_{2} top_material, bottom_material, side_material, n, h, x1, y1. alpha1, s1, mat1, ... xn, yn, alphan, sn, matn 

BPRISM_ top_material, bottom_material, side_material, n, h, radius, x1, y1, s1, ... xn, yn, sn

我知道总有一些字符串,换行符,相等的字符串以及我要存储的东西,换行符......

我用sed尝试了一些标签技巧,但我认为awk应该更好。

awk '{cmd=$1;getline;if($0=""){getline;if(cmd==$1){print $0}}}' rg.txt

不输出任何内容。

2 个答案:

答案 0 :(得分:2)

试试这个awk

$ awk 'BEGIN{cmd="";RS=""; ORS="\n"} $1==cmd{gsub(/\n/," "); print $0}; {cmd=$1}' test.txt
CPRISM_{2} top_material, bottom_material, side_material,   n, h,   x1, y1. alpha1, s1, mat1,  ...  xn, yn, alphan, sn, matn 
BPRISM_ top_material, bottom_material, side_material, n, h, radius, x1, y1, s1, ... xn, yn, sn

看看你的awk脚本级别,我想,这是你自我解释的脚本:)。

对于大记录尺寸,

编辑
试试这个:

awk 'NF==1{cmd=$1;next} NF==0{next} $1==cmd{printf "%s", $0; while (1) { if (! getline tmp) break; if(length(tmp)) printf " %s", tmp; else break;};print ""}' test.txt

希望这适用于大输入文件大小。

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -rn '/^\s*\S+\s*$/{$!N;$!N;/^\s*(\S+)\s*\n\s*\n\s*\1\s*/!b;:a;$bb;N;/\n\s*$/!ba;:b;s/.*\n\s*\n//;s/\s*\n\s*/ /gp}' file

这匹配模式的前三行,然后删除前两行并追加后续行直到文件结尾或空行并打印出结果。