我正在寻找一种可管道化的单行代码来对大量列进行重新排序(其中手动输入列号,例如在诸如此类的awk
命令中awk '{print $3,$2,$1}'
是不可行的)。顺序可以通过排序方案给出(字母、数字 - 就像“排序”,但作用于列而不是行。)或者在文本文件中任意给出。
我不确定它是最好的解决方案,也不确定它能否在巨大的桌子上快速运行,但它应该可以:
echo -e "2 1 3\n5 4 6\n8 7 9" | \
awk '{for (i=1;i<=NF;i++) {a[NR,i]=$i} } \
NF>p {p=NF} \
END {for (j=1;j<=p;j++) {str=a[1,j]; \
for (i=2;i<=NR;i++) {str=str" "a[i,j];}print str}}' \
| sort -n | \
awk '{for (i=1;i<=NF;i++) {a[NR,i]=$i} } \
NF>p {p=NF} \
END {for (j=1;j<=p;j++) {str=a[1,j]; \
for (i=2;i<=NR;i++) {str=str" "a[i,j];}print str}}'
Run Code Online (Sandbox Code Playgroud)
它是如何工作的:它转置表格,然后对表格进行排序并将其转置回去。
顺便说一句echo -e "2 1 3\n5 4 6\n8 7 9"
将导致
2 1 3
5 4 6
8 7 9
Run Code Online (Sandbox Code Playgroud)
脚本工作后,结果将是
1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
附:我认为可以在 awk 中对数组进行排序,不幸的是我没有足够的时间来做到这一点。