0

我似乎无法按照我的意愿对以下数据进行排序;

find output/ -type f -name *.raw | sort 
output/rtp.0.0.raw
output/rtp.0.10.raw
output/rtp.0.11.raw
output/rtp.0.12.raw
output/rtp.0.13.raw
output/rtp.0.14.raw
output/rtp.0.15.raw
output/rtp.0.16.raw
output/rtp.0.17.raw
output/rtp.0.18.raw
output/rtp.0.19.raw
output/rtp.0.1.raw
output/rtp.0.20.raw
output/rtp.0.2.raw
output/rtp.0.3.raw
output/rtp.0.4.raw
output/rtp.0.5.raw
output/rtp.0.6.raw
output/rtp.0.7.raw
output/rtp.0.8.raw
output/rtp.0.9.raw

在上面的示例中,我没有将任何参数传递给sort命令。无论我使用什么选项,我都无法接近我想要的结果。我想要以下输出;

find output/ -type f -name *.raw | sort 
output/rtp.0.0.raw
output/rtp.0.1.raw
output/rtp.0.2.raw
output/rtp.0.3.raw
output/rtp.0.4.raw
output/rtp.0.5.raw
output/rtp.0.6.raw
output/rtp.0.7.raw
output/rtp.0.8.raw
output/rtp.0.9.raw
output/rtp.0.10.raw
output/rtp.0.11.raw
output/rtp.0.12.raw
output/rtp.0.13.raw
output/rtp.0.14.raw
output/rtp.0.15.raw
output/rtp.0.16.raw
output/rtp.0.17.raw
output/rtp.0.18.raw
output/rtp.0.19.raw
output/rtp.0.20.raw

我尝试使用-t .选项将字段分隔符设置为句号。我还尝试了-k指定字段的选项,并且-g, -h, -n,但没有一个选项有帮助。除非我没有正确理解手册页并忽略了我的答案,否则我在手册页中看不到其他任何我需要的东西。

我可以用 产生我需要的结果sort吗?如果可以,怎么做?

此外,这种情况很少见,但有时第 2 列一直显示为“0”可能会增加。可以将其计入排序吗?

4

3 回答 3

7

这使得它:

$ sort -t'.' -n -k3 a
output/rtp.0.0.raw
output/rtp.0.1.raw
output/rtp.0.2.raw
output/rtp.0.3.raw
output/rtp.0.4.raw
output/rtp.0.5.raw
output/rtp.0.6.raw
output/rtp.0.7.raw
output/rtp.0.8.raw
output/rtp.0.9.raw
output/rtp.0.10.raw
output/rtp.0.11.raw
output/rtp.0.12.raw
output/rtp.0.13.raw
output/rtp.0.14.raw
output/rtp.0.15.raw
output/rtp.0.16.raw
output/rtp.0.17.raw
output/rtp.0.18.raw
output/rtp.0.19.raw
output/rtp.0.20.raw

如您所见,我们需要不同的选择:

  • -t'.'将点设置.为字段分隔符。
  • -n使其成为数字排序。
  • -k3检查第三列。

更新

这也使得它:

$ sort -t'.' -V -k2 a
output/rtp.0.0.raw
output/rtp.0.1.raw
output/rtp.0.2.raw
output/rtp.0.3.raw
output/rtp.0.4.raw
output/rtp.0.5.raw
output/rtp.0.6.raw
output/rtp.0.7.raw
output/rtp.0.8.raw
output/rtp.0.9.raw
output/rtp.0.10.raw
output/rtp.0.11.raw
output/rtp.0.12.raw
output/rtp.0.13.raw
output/rtp.0.14.raw
output/rtp.0.15.raw
output/rtp.0.16.raw
output/rtp.0.17.raw
output/rtp.0.18.raw
output/rtp.0.19.raw
output/rtp.0.20.raw

如您所见,我们需要不同的选择:

  • -t'.'将点设置.为字段分隔符。
  • -V使其根据版本排序。
  • -k2检查第二列。
于 2013-07-29T16:27:41.723 回答
4

Fedorqui 的解决方案很好(+1),但不是所有版本的sortsupport -V。对于那些没有的版本,您需要比 fedorqui 的原始解决方案多做一些工作。这应该足够了:

sort -t. -k2,2 -k3,3 -n

如果你使用,你会得到一个稍微不同的排序(例如,'05' 排序在 '1' 之前而不是之后):

sort -t. -k2g

(请注意,这-g也是非标准的,并非在所有版本中都可用sort)。

于 2013-07-30T10:29:40.277 回答
1
sort -t'.' -n -k3

将第 3 列从小到大排序

如果你想从大到小排序,你可以使用'-r'选项:

sort -t'.' -n -r -k3
于 2018-10-18T02:12:51.897 回答