Bash

如何使用bash腳本對與字元串+數字組合的字元串進行排序?

  • October 23, 2021

這是我要排序的數據。但是sort將數字處理為字元串,數據沒有按我的預期排序。

/home/files/profile1

/home/files/profile10

/home/files/profile11

/home/files/profile12

/home/files/profile14

/home/files/profile15

/home/files/profile16

/home/files/profile2

/home /files/profile3

/home/files/profile4

/home/files/profile5

/home/files/profile6

/home/files/profile7

/home/files/profile8

/home/files/profile9

我想把這個排序,

/home/files/profile1

/home/files/profile2

/home/files/profile3

/home/files/profile4

/home/files/profile5

/home/files/profile6

/home/files/profile7

/home/files/profile8

/home /files/profile9

/home/files/profile10

/home/files/profile11

/home/files/profile12

/home/files/profile14

/home/files/profile15

/home/files/profile16

bash腳本有什麼好方法嗎?我不能在這裡使用 ruby​​ 或 python 腳本。

您可以使用臨時標記字元來分隔數字:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

在這裡,標記字元是’;’ - 它不能是您想要排序的任何文件名的一部分 - 但您可以交換 ‘;’ 任何你喜歡的角色。您必須相應地更改sed,sorttr部分。

管道的工作原理如下:該sed命令在任何數字之前插入標記,該sort命令將標記解釋為欄位分隔符,使用第二個欄位作為數字排序鍵進行排序,該tr命令再次刪除標記。

log表示輸入文件 - 您也可以將輸入通過管道傳輸到sed.

這與這個問題非常相似。問題是您有一個要排序的字母數字欄位,並且-n沒有明智地對待它,但是版本排序 ( -V) 可以。因此使用:

sort -V

請注意,GNU、FreeBSD 和 OpenBSD 排序實現目前支持此功能。

引用自:https://unix.stackexchange.com/questions/41655