让我们创建一个转置文件的函数(让行变成列,列变成行):
transpose () {
awk '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)}
END {for (i=1; i<=max; i++)
{for (j=1; j<=NR; j++)
printf "%s%s", a[i,j], (j<NR?OFS:ORS)
}
}'
}
这只是将所有数据加载到二维数组a[line,column],然后将其打印回a[column,line],以便转置给定的输入。包装器transpose () { } 用于将其存储为 bash 函数。您只需将其复制粘贴到您的 shell 中(或者,如果您希望它成为永久功能,则可以在 ~/.bashrc 中,在您打开会话时随时可用)。
然后,通过使用它,我们可以很容易地使用sort -n -k2解决问题:根据第2列进行数字排序。然后,转回。
$ cat a | transpose | sort -n -k2 | transpose
john sarah mark
5 10 20
z x y
如果您想要一个好的格式作为最终输出,只需像这样通过管道传递到column:
$ cat a | transpose | sort -n -k2 | transpose | column -t
john sarah mark
5 10 20
z x y
一步一步:
$ cat a | transpose
sarah 10 x
mark 20 y
john 5 z
$ cat a | transpose | sort -n -k2
john 5 z
sarah 10 x
mark 20 y
$ cat a | transpose | sort -n -k2 | transpose
john sarah mark
5 10 20
z x y