gpt4 book ai didi

bash - 使用 bash 对数据进行水平排序

转载 作者:行者123 更新时间:2023-11-29 09:19:16 26 4
gpt4 key购买 nike

我有一个充满列数据的文件

sarah mark john
10 20 5
x y z

我想对数据进行排序,使列保持不变,但第二行按递增顺序排列,因此看起来像这样:

john sarah mark
5 10 20
z x y

我一直在查看排序命令,但只能找到垂直排序,而不是水平排序。我很乐意使用任何工具,任何帮助表示赞赏。谢谢!

最佳答案

让我们创建一个函数来转置文件(使行成为列,列成为行):

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 中,如果您希望它成为永久函数,在您打开 session 时随时可用)。

然后,通过使用它,我们可以使用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

关于bash - 使用 bash 对数据进行水平排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25062169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com