我有一个大约有 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;
最佳答案
看看我对 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
-solution,您可以获得与上述相同的结果: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
但是,如果您想要对人眼进行一些很好的对齐,则必须添加一些额外的代码(即,确定每列中最长的字段,填充所有其他条目,...)才能获得所需的内容。
关于linux - 如何将所有段落从垂直重新排列为水平(所有段落彼此相邻),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34483463/