Bash 如何将多列拆分为几列?

Bash 如何将多列拆分为几列?,bash,awk,Bash,Awk,我有以下数据: X Y Z X Y Z X Y Z 1 2 3 4 5 6 7 8 9 X Y Z X Y Z X Y Z 10 11 12 13 14 15 16 17 18 我想这样重新安排: X Y Z 1 2 3 X Y Z 4 5 6 X Y Z 7 8 9 X Y Z

我有以下数据:

 X  Y  Z    X  Y  Z   X  Y  Z   
 1  2  3    4  5  6   7  8  9

 X  Y  Z    X  Y  Z   X  Y  Z    
10 11 12   13 14 15  16 17 18
我想这样重新安排:

 X  Y  Z        
 1  2  3    

 X  Y  Z       
 4  5  6   

 X  Y  Z       
 7  8  9  

 X  Y  Z       
10 11 12  

 X  Y  Z       
13 14 15

 X  Y  Z       
16  17 18    
使用
awk'{print$1,$2,$3}'
,我可以打印列集,但无法按上述所需方式排列

任何帮助都将不胜感激。

请尝试:

awk '!(NR%2){for (i=1;i<=NF-2;i=i+3){print a[i], a[i+1], a[i+2]; print $i, $(i+1), $(i+2)}} {split($0,a)}' file
现在运行我们的命令:

$ awk '!(NR%2){for (i=1;i<=NF-2;i=i+3){print a[i], a[i+1], a[i+2]; print $i, $(i+1), $(i+2)}} {split($0,a)}' file
X Y Z
1 2 3
X Y Z
4 5 6
X Y Z
7 8 9
X Y Z
10 11 12
X Y Z
13 14 15
X Y Z
16 17 18

$awk'!(NR%2){用于(i=1;我希望您的示例输入文件中只显示4行或更多行?不,我有96行。每个x、y和z对应一组值。不,没有空白字符,是的,完全正确。在下面的答案部分,@John1024几乎解决了问题。但我无法扩展它。感谢您指出,现在,这是正确的格式.Hi,John,可以扩展吗?在每个X Y Z下,我有11个值。@AmanullahMalik如果你有11个值,那么你就不再有三个组了。因此,你真的在问一个不同的问题,需要解释一下在这种情况下你的输入和期望的输出是什么。
$ awk '!(NR%2){for (i=1;i<=NF-2;i=i+3){print a[i], a[i+1], a[i+2]; print $i, $(i+1), $(i+2)}} {split($0,a)}' file
X Y Z
1 2 3
X Y Z
4 5 6
X Y Z
7 8 9
X Y Z
10 11 12
X Y Z
13 14 15
X Y Z
16 17 18
$ cat tst.awk
# numCols in how many fields are required in output, can be passed as -v numCols=<number>
BEGIN { OFS="\t"; numCols=(numCols ? numCols : 3) }
!NF { prt(); numRows=0; next }
{
    ++numRows
    numGrps = 0
    colNr = 0
    for (i=1; i<=NF; i++) {
        colNr = ( (i - 1) % numCols ) + 1
        numGrps += ( colNr == 1 ? 1 : 0 )
        val[numGrps,numRows,colNr] = $i
    }
}
END { prt() }

function prt(   rowNr, grpNr, colNr) {
    for (grpNr=1; grpNr<=numGrps; grpNr++) {
        for (rowNr=1; rowNr<=numRows; rowNr++) {
            for (colNr=1; colNr<=numCols; colNr++) {
                printf "%s%s", val[grpNr,rowNr,colNr], (colNr<numCols ? OFS : ORS)
            }
        }
        print ""
    }
}
$ awk -f tst.awk file
X       Y       Z
1       2       3

X       Y       Z
4       5       6

X       Y       Z
7       8       9

X       Y       Z
10      11      12

X       Y       Z
13      14      15

X       Y       Z
16      17      18