我的数据如下:
<some text0>
<text1> <text2> .
<some text1>
<text3> <text4> .
现在我想将此数据转换为以下格式:
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
我知道我可以使用C ++来做到这一点,但有没有办法使用linux做到这一点。我知道sed很擅长替换字符...但我不知道如何使用sed来替换上面的表单。
答案 0 :(得分:2)
这个单行程适用于您的示例:
kent$ awk '!/\.$/{s=$0;next}sub(/\.$/,s".")' f
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
解释:
awk #the program
!/\.$/{s=$0;next} #if the line was not ending with dot(.),
#assign it to s, read next line
sub(/\.$/,s".") #we are here when the line ends with ".",
#then we replace ending "." with s, and print.
f #the input file
答案 1 :(得分:2)
sed "N;s/\(.*\)\n\(.*\) \.$/\2 \1./" YourFile
默认情况下,sed一次读取1行到工作缓冲区,并在流程结束时打印内容,从下一行开始处理。
N
:向缓冲区添加\ n而不是加载下一行输入
s/Part1/Part2/
:开始缓冲区直到\ n,\ n比所有内容都要好。在结束之前($)并以不同的顺序重写它\ 1 \ 2分别是第1组和第2组的内容(组是在s / Part1 / Part2 /的第一部分(和)之间找到匹配元素的内容) p>
请注意,这里使用的\主要用于转义下一个char,因为“和”之间的shell替换。意思是“点”
答案 2 :(得分:0)
使用gawk
重新定义记录分隔符:
$ awk 'NR>1{print $1,$2,R $3}{R=RT}' RS='<some text[^>]>' file
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
答案 3 :(得分:0)
我会使用awk,但这是一个很长的对比管道
sed 's/\.$//' <<END | tac | paste -d " " - - | tac | sed 's/$/./'
<some text0>
<text1> <text2> .
<some text1>
<text3> <text4> .
END sed 's/\.$//' <<END | tac | paste -d " " - - | tac | sed 's/$/./'
<some text0>
<text1> <text2> .
<some text1>
<text3> <text4> .
END
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
答案 4 :(得分:0)
简单易懂awk
awk '{a=$0;getline;b=$NF;$NF="";print $0 a b}'
<text1> <text2> <some text0>.
<text3> <text4> <some text1>.
a=$0
将第一行存储在变量a
中
getline
获取下一行
b=$NF
将最后一个字段存储在b
(.
)中
$NF=""
清除最后一个字段
print $0 a b
打印此行,上一行和b
(.
)