簡體   English   中英

bash中的文件排序

[英]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 在我的實現中也會忽略它。

該組合強制將V0V01V02進行比較,而不將下划線與點進行比較,因此您可以獲得所需的順序。

下面給你正確的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM