我需要从像这样的文本文件中创建
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
不输出任何内容。
答案 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
这匹配模式的前三行,然后删除前两行并追加后续行直到文件结尾或空行并打印出结果。