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