[英]Sorting files in bash
我將感謝您的幫助。
我有文件:
V0.1__file_a.sql
V0.2__file_b.sql
V0__file_c.sql
V1.1__file_a.sql
V1.2__b.sql
V1.3__c.sql
V1.4__d.sql
V1.5__e.sql
V1.6__f.sql
V1__file_g.sql
我想使用sort命令以下一種方式對它們進行排序
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql
V1__file_g.sql
V1.1__file_a.sql
V1.2__b.sql
V1.3__c.sql
V1.4__d.sql
V1.5__e.sql
V1.6__f.sql
標志-n
, -g
對此沒有幫助。
我似乎打破了我的大腦來解決這個問題
有人可以幫忙嗎?
謝謝!
-k
選項接受一個鍵定義參數,您可以將其與-t _
一起使用以使用下划線作為字段分隔符:
> sort -t _ -k 1,2 data.txt
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql
V1__file_g.sql
V1.1__file_a.sql
V1.2__b.sql
V1.3__c.sql
V1.4__d.sql
V1.5__e.sql
V1.6__f.sql
對於這個數據集,只對第一個字段進行排序。
$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -t _ -k 1,1
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql
除非我使用字典排序( -d
),否則使用-k 1,2
對我來說也失敗了。
$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -t _ -k 1,2
V0.1__file_a.sql
V0.2__file_b.sql
V0__file_c.sql
但與-d
$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -d -t _ -k 1,2
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql
字典排序將“僅考慮空格和字母數字字符”,因此忽略點和下划線,使所有文件名都是字母數字的單個字符串,數字作為字符排序到頂部。
-d
單獨仍然失敗 - 您需要建立字段。
$: printf "%s\n" V0.1__file_a.sql V0.2__file_b.sql V0__file_c.sql | sort -d
V0.1__file_a.sql
V0.2__file_b.sql
V0__file_c.sql
使用-t _
設置下划線作為分隔符,但如果我沒有明確告訴它使用關鍵字段, sort 在我的實現中也會忽略它。
該組合強制將V0
與V01
和V02
進行比較,而不將下划線與點進行比較,因此您可以獲得所需的順序。
下面給你正確的 output
$ cat files.txt | sort -t'_' -k1,1
V0__file_c.sql
V0.1__file_a.sql
V0.2__file_b.sql
V1__file_g.sql
V1.1__file_a.sql
V1.2__b.sql
V1.3__c.sql
V1.4__d.sql
V1.5__e.sql
V1.6__f.sql
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.