2015-04-02 26 views
1

我有文件的集合,如巴什 - 文件名排序基於多個字段

fa_1_se-1.xml 
fa_1_se-2.xml 
fa_1_se-3.xml 
fa_1_se-10.xml 
fa_2_se-1.xml 
fa_2_se-2.xml 
fa_2_se-12.xml 

在下劃線後的數字表示爲person_id和數量後,連字符是RECORD_ID。

我想通過person_id先排序然後record_id沒有成功。

ls | sort -t- -k2

f_a_1_se-1.xml 
f_a_2_se-1.xml 
f_a_1_se-10.xml 
f_a_2_se-12.xml 
f_a_1_se-2.xml 
f_a_2_se-2.xml 
f_a_1_se-3.xml 

我怎樣才能得到它通過爲person_id進行排序,然後RECORD_ID?

謝謝!

回答

3

您可以使用--stable選項:

sort --stable -t_ -nk2 file 
fa_1_se-1.xml 
fa_1_se-2.xml 
fa_1_se-3.xml 
fa_1_se-10.xml 
fa_2_se-1.xml 
fa_2_se-2.xml 
fa_2_se-12.xml 

編輯:

你還可以嘗試:

printf "%s\n" fa* | tr '-' '_' | sort -t_ -nk2 -nk4 | sed 's/_\([^_]*\)$/-\1/' 
+0

我嘗試了'ls fa * | sort --stable -t_ -nk2'但它不會產生正確的輸出。我做錯了什麼? – dopplesoldner 2015-04-02 16:50:51

+0

上面是我得到的排序輸出的直接複製/粘貼。從'ls'解析輸出有許多缺陷。 – anubhava 2015-04-02 16:52:16

+0

好的,沒有意識到ls有問題。文件名到文件中的最佳方式是什麼?謝謝 – dopplesoldner 2015-04-02 16:55:41

1

對於數據未在任何way-預排序一種方法是標籤分類,按標籤排序:

awk -F '[_-\.]' '{print $2, $4, $0}' filename | sort -k1n -k2n | awk '{print $3}' 

其中filename具有列表。 ls確實preort,所以@anubhava的答案似乎對我來說是正確的。這個例子只是一個插件。