Linux如何在coumns中剪切线条和打印

时间:2017-09-07 16:30:37

标签: bash awk sed cut tr

我有100行1列。像这样的数据

line1  
line2  
line3  
.  
.  
.  
line100  

我想要这样的输出

line1     line11     line21 ... line91  
line2     line12     line22 ... line92  
line2     line13     line23 ... line93  
line4     line14     line24 ... line94  
.  
.  
.  
line10    line20     line30 ... line100  

有没有人帮我这样做。

非常感谢。

5 个答案:

答案 0 :(得分:3)

pr -ts" " --columns 10 file_name

其中file_name是您要转换的文件的名称。

答案 1 :(得分:1)

这是另一个

$ printf "%s\n" line{1..100} | pr -10t

line1  line11 line21 line31 line41 line51 line61 line71 line81 line91
line2  line12 line22 line32 line42 line52 line62 line72 line82 line92
line3  line13 line23 line33 line43 line53 line63 line73 line83 line93
line4  line14 line24 line34 line44 line54 line64 line74 line84 line94
line5  line15 line25 line35 line45 line55 line65 line75 line85 line95
line6  line16 line26 line36 line46 line56 line66 line76 line86 line96
line7  line17 line27 line37 line47 line57 line67 line77 line87 line97
line8  line18 line28 line38 line48 line58 line68 line78 line88 line98
line9  line19 line29 line39 line49 line59 line69 line79 line89 line99
line10 line20 line30 line40 line50 line60 line70 line80 line90 line100

答案 2 :(得分:0)

您可以使用rs

$ seq 30 | rs 0 4
1   2   3   4
5   6   7   8
9   10  11  12
13  14  15  16
17  18  19  20
21  22  23  24
25  26  27  28
29  30  

如果你希望线条相对于:

$ seq 30 | rs 4 0 | rs -T
1   9   17  25
2   10  18  26
3   11  19  27
4   12  20  28
5   13  21  29
6   14  22  30
7   15  23  
8   16  24  

答案 3 :(得分:0)

将一列转换为 10 列,每列具有 10 值。听起来像矩阵 10x10 使用单个 gawk 脚本:

awk -v d=10 'NR==1{ c=1 }
     { a[c][++k]=$0; if(!(NR%d)){ c++; k=0 } }
     END{ 
         for(i=1;i<=d;i++) 
             for(j=1;j<=c;j++) printf "%s%s",a[j][i],(j==c)? ORS:FS 
     }' file
  • -d=10 - devisor / coefficient,它允许指定每列 的最大行数

输出:

line1 line11 line21 line31 line41 line51 line61 line71 line81 line91 
line2 line12 line22 line32 line42 line52 line62 line72 line82 line92 
line3 line13 line23 line33 line43 line53 line63 line73 line83 line93 
line4 line14 line24 line34 line44 line54 line64 line74 line84 line94 
line5 line15 line25 line35 line45 line55 line65 line75 line85 line95 
line6 line16 line26 line36 line46 line56 line66 line76 line86 line96 
line7 line17 line27 line37 line47 line57 line67 line77 line87 line97 
line8 line18 line28 line38 line48 line58 line68 line78 line88 line98 
line9 line19 line29 line39 line49 line59 line69 line79 line89 line99 
line10 line20 line30 line40 line50 line60 line70 line80 line90 line100

答案 4 :(得分:0)

你能不能一次尝试关注awk。

awk -v col=10 '
{
  a[FNR]=$0
}
END{
  for(i=1;i<=col;i++){
     for(j=0;j<=FNR;j=j+col){
        printf("%s%s",a[i+j],j==FNR?"":" ");
}
     print ""
}
}
'   Input_file

<强>说明: 所以我在这里创建了一个名为col的变量,其值为10(表示我们要打印的列数)。然后我创建一个名为a的数组,其索引是FNR(当前行的值),value是当前行的值。现在在awk的END块中,我开始一个for循环,它从变量i的值开始,从1到col的值(在这种情况下最大值为10),然后启动一个内部循环,从变量j的值0开始直到FNR的值(这将是Input_file中的总行数)以及每次它增加10的值。在这个内部for循环中打印数组a的值[ i + j],所以它会像[1],[11],[21] ......等等。然后我打印的第二个字符串是这些数组a值之间的空格和检查如果它是最后一个元素,请不要打印空格。现在在外部for循环打印null值,这将在这里打印一个新行。