shell - 如何按字母顺序对第二列进行排序,然后在 shell 脚本中按数字排序?
问题描述
我有一个如下的文本文件:
信息.txt
files-550519470 19h
files-1662192679 1d
files-247106034 1d
files-1986982365 2d
files-464153317 12m
files-739420408 3d
files-77614277 3m
files-374059185 4d
files-909323637 4d
files-101830442 5d
files-1270496134 5d
files-1797797160 6d
files-812888216 7d
files-118869238 7h
我想根据第二列字母进行排序,然后在同一第二列中的数字降序排列,输出应如下所示:
files-812888216 7d
files-1797797160 6d
files-101830442 5d
files-101830442 5d
files-1270496134 5d
files-374059185 4d
files-909323637 4d
files-374059185 4d
files-909323637 4d
files-739420408 3d
files-1986982365 2d
files-1662192679 1d
files-247106034 1d
files-550519470 19h
files-118869238 7h
files-464153317 12m
files-77614277 3m
我可以通过以下命令根据数字反转,但无法弄清楚字母表。有人可以建议吗?
sort -r -nk2 info.txt
解决方案
$ sort -t $'-' -k 2 file |
sed -E 's/(.*) ([[:digit:]][[:digit:]]*)([dmh]$)/\2 \3 \1 \2\3/' |
awk 'BEGIN{arr["m"]=1; arr["h"]=60; arr["d"]=60*24}
{$2=$1*arr[$2]; $1=""; print}' |
sort -s -k1nr |
cut -d' ' -f3-
files-812888216 7d
files-1797797160 6d
files-101830442 5d
files-101830442 5d
files-1270496134 5d
files-374059185 4d
files-374059185 4d
files-909323637 4d
files-909323637 4d
files-739420408 3d
files-1986982365 2d
files-1662192679 1d
files-247106034 1d
files-550519470 19h
files-118869238 7h
files-464153317 12m
files-77614277 3m
这应该比 Bash 循环快得多。如果您必须gawk
更换sort
和sed
如果您有 GNU 或 BSD 排序,您可以利用字母顺序d<h<m
而不进行转换:
$ sed -E 's/([^-]*)-(.*) ([[:digit:]][[:digit:]]*)([dmh]$)/\2 \4 \3 \1-\2 \3\4/' file |
sort -s -t $' ' -k2,2 -k3,3nr -k1,1 |
cut -d $' ' -f4-
# same output
推荐阅读
- javascript - 返回后如何继续执行代码
- c# - 位图清晰度差
- mysql - MySQL:从临时表中聚合多个对象的更改
- c# - Dapper IPredicate 到 linq 的转换
- php - 如何在 Symfony 中处理 AES 密钥
- javascript - Ndv3 图表应通过单击重绘子图表和子图表
- java - 添加列表项时JavaFX TableView行不刷新
- protractor - 量角器启动 chrome 数据:。url 并且需要将近 10 分钟才能导航到应用程序 URL
- r - 计算 data.table 中事件以来的天数
- python - 使用 scikit-learn 训练模型时出现问题,shell 重新启动