我有一个大约有25个段落的文件,它们用一个空白行分隔,每个段落有大约2到20行,每行有5列用分号分隔。如何将段落2移到段落旁边1,第3段,右边第2段,依此类推。 我的目标是稍后将所有内容粘贴到Excel中。 这里使用的数字只是任何单词/数字的示例。
111; 111; 111; 111; 111;
111; 111; 111; 111; 111;
222; 222; 222; 222; 222;
222; 222; 222; 222; 222;
222; 222; 222; 222; 222;
333; 333; 333; 333; 333;
333; 333; 333; 333; 333;
333; 333; 333; 333; 333;
333; 333; 333; 333; 333;
期望的输出:
111;111;111;111;111; 222;222;222;222;222; 333;333;333;333;333;
111;111;111;111;111; 222;222;222;222;222; 333;333;333;333;333;
222;222;222;222;222; 333;333;333;333;333;
333;333;333;333;333;
答案 0 :(得分:3)
查看我对How to move everything following a dash to a new column?的回答。
如果您的解决方案不需要基于awk,则以下代码可能会执行您想要的操作:
csplit -f tempfile in.txt '/^\s*$/+1' {*}; paste tempfile* > out.txt
示例数据的输出是
111;111;111;111;111; 222;222;222;222;222; 333;333;333;333;333;
111;111;111;111;111; 222;222;222;222;222; 333;333;333;333;333;
222;222;222;222;222; 333;333;333;333;333;
333;333;333;333;333;
如您所见,制表符分隔列,如果您想在out.txt
上进行一些后处理,这是一个好主意。
如果需要awk
- 解决方案,您将获得与上述相同的结果:
awk 'BEGIN{FS="\n"; RS="\n\n";}
{for(i=1; i<= NF;i++)
ar[NR,i]=$i
nf = nf <NF? NF : nf}
END{ for(j=1; j <= nf; j++){
str=""
for(i = 1; i <= NR; i++){
str = str""ar[i,j]"\t"
}
print str
}
}' in.txt
但是,如果你想为人眼做一些很好的对齐,你将不得不添加一些额外的代码(即,确定每列中最长的字段,填充所有其他条目,......)以获得你想要的。