如何按最后一列对文本进行排序?

如何按最后一列对文本进行排序?

此命令

udisksctl status

使用 Ubuntu 20.04.3 得到:

MODEL                     REVISION  SERIAL               DEVICE
--------------------------------------------------------------------------
SanDisk Extreme           0001      AA010302161107080264 sdb     
ATAPI   DVD A  DH17A3L    8H3D      ATAPI_DVD_A_DH17A3L  sr0     
KINGSTON SA400S27230G     S3Z40107  50016B7683B02C0B     sda     
Optiarc DVD RW AD-7580A   1.04      Optiarc_DVD_RW_AD-7580A sr0     
HL-DT-STDVD-RAM GH22NS30  2.00      HL-DT-STDVD-RAM_GH22NS30 sr0 
Floppy Drive                                             fd0     
Generic Flash Disk        8.07      162194AF             sdc     

目标是按每行(标题之后)的最后 3 个字符排序,得到:

Floppy Drive                                             fd0     
KINGSTON SA400S27230G     S3Z40107  50016B7683B02C0B     sda     
SanDisk Extreme           0001      AA010302161107080264 sdb     
Generic Flash Disk        8.07      162194AF             sdc     
Optiarc DVD RW AD-7580A   1.04      Optiarc_DVD_RW_AD-7580A sr0     
ATAPI   DVD A  DH17A3L    8H3D      ATAPI_DVD_A_DH17A3L  sr0     
HL-DT-STDVD-RAM GH22NS30  2.00      HL-DT-STDVD-RAM_GH22NS30 sr0 

我获得了部分成功

udisksctl status | tail -n+3 | rev | sort -b -k1.1 | rev | grep 'sd\|hd\|fd\|sr\|st'



udisksctl status | tail -n+3 

从底部(尾部)到第 3 行,从而切出 2 行标题:

MODEL                     REVISION  SERIAL               DEVICE
--------------------------------------------------------------------------
udisksctl status | tail -n+3 | rev |

反转,将行中的最后一个字符移到行的最前面。

udisksctl status | tail -n+3 | rev | sort -b -k1.1 

sort -b= 忽略前导空格
-k1.1= 按照忽略空格后的键首字母排序

udisksctl status | tail -n+3 | rev | sort -b -k1.1 | rev 

撤消 逆转

udisksctl status | tail -n+3 | rev | sort -b -k1.1 | rev | grep 'sd\|hd\|fd\|sr\|st'

使用 grep 突出显示:

  • sd  Scsi 设备
  • hd  硬盘驱动器
  • fd  软盘驱动器
  • sr  Scsi ROM、cdrom、dvd
  • st  Scsi 磁带驱动器
  • ...

为简单起见,重点关注最后 3 个字母。问题是如何进行排序以获得:

fd0     
sda     
sdb     
sdc     
sr0     
sr0     
sr0     

因为如上所示的问题是按最后 1 个字母排序,而不是按最后 3 个字母排序:

fd0     
sr0     
sr0     
sr0     
sda     
sdb     
sdc     

如何按一行中的最后 3 个字符排序?(每行的长度不同。)

答案1

尝试这个:

udisksctl status | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '

这也照顾了较长的字符串,因为nvme0n1排序是按最后一列进行的,而不是按字符数进行的。

我没有 udiskctl,但通过将您的列表复制到文件sortof、添加 NVM 驱动器进行验证并添加文件进行了测试:

pg@TREX:~/test$ cat sortof | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '
HL-DT-STDVD-RAM GH22NS30 2.00 HL-DT-STDVD-RAM_GH22NS30 sr0 Floppy Drive fd0
KINGSTON SA400S27230G S3Z40107 50016B7683B02C0B nvme1p
KINGSTON SA400S27230G S3Z40107 50016B7683B02C0B sda
SanDisk Extreme 0001 AA010302161107080264 sdb
Generic Flash Disk 8.07 162194AF sdc
ATAPI DVD A DH17A3L 8H3D ATAPI_DVD_A_DH17A3L sr0
Optiarc DVD RW AD-7580A 1.04 Optiarc_DVD_RW_AD-7580A sr0

...因此当您通过管道传输 udiskctl 输出时它也应该可以工作。

相关内容