Bash / Linux使用自定义字段分隔符按第3列排序

时间:2013-07-29 16:25:37

标签: linux sorting

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

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生成我需要的结果吗?如果是,那该怎么做?

此外,它变得罕见但有时第二列显示为'0'一直向下可能会增加。这可以考虑到排序吗?

3 个答案:

答案 0 :(得分: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查看第3栏。

更新

这也是:

$ 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检查第二栏。

答案 1 :(得分:4)

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

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

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

sort -t. -k2g

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

答案 2 :(得分:1)

sort -t'.' -n -k3

将第3列从最小到最大排序

如果您要从最大到最小排序, 您可以使用'-r'选项:

sort -t'.' -n -r -k3