我有一个文件,其中有一列文字,短划线( - )分隔不同的行。我想将短划线下的所有内容移动到新列。我的输入文件如下所示:
jim
bob
-
sally
sue
ed
-
bill
-
jerry
curly
phil
-
我希望我的输出文件看起来像这样:
jim sally bill jerry
bob sue - curly
- ed phil
- -
提前谢谢。
答案 0 :(得分:5)
您可以尝试使用名为input
的输入文件:
csplit -f tempfile input '/-/+1' '{*}'; paste tempfile*
使用csplit
,我们会为所需输出(tempfile01
,tempfile02
,...)中的每个“列”生成一个文件。
接下来,我们合并这些临时文件。使用给定的样本输入,上述命令的输出为:
jim sally bill jerry
bob sue - curly
- ed phil
- -
添加rm tempfile*
以进行必要的清理可能是个好主意。
csplit -f tempfile input '/-/+1' '{*}'; paste tempfile* > output; rm tempfile*
答案 1 :(得分:1)
我自己没有尝试过,所以它不太可能以你想要的方式运作。这是一个思考它并使其按您想要的方式工作的机会。在你说“正确”之后,请随意编辑这篇文章。
BEGIN {
column = 1;
}
/^-$/ {
column++;
row = 1;
next;
}
{
Word[column,row] = $1;
Rows[column] = ++row;
}
END {
for (col = 1; col < column; col++) {
for (row = 1; row < Rows[col]; row++) {
printf ("%s\t", Word[col,row]);
}
printf ("\n");
}
}
答案 2 :(得分:1)
有趣的运动,我的gawk
命题:
gawk 'BEGIN{row=col=0}
{d[col][row]=d[col][++row]=$1}
$1=="-"{col++
if (row>mrow){
mrow=row
}
row=0
next}
END{
for (r=0;r<=mrow;r++) {
for (c=0;c<=col;c++) {
printf("%s\t",d[c][r])
}
print ""
}}' file
<强>结果
jim sally bill jerry
bob sue - curly
- ed phil
- -