Deși este exagerat pentru exemplul de față din cauza soluție propusă în răspunsul utilizatorului68186, în general ați putea face ceva de genul acesta în GNU awk:
gawk -F/ '
funcția mycmp(i1,v1,i2,v2) {
m = split(v1,a);
n = split(v2,b);
returnează a[m]"" > b[n]"" ? 1 : a[m]"" < b[n]"" ? -1:0
}
{
linii[NR] = $0
}
SFÂRŞIT {
PROCINFO["sorted_in"] = "mycmp";
pentru(i în rânduri) linii de imprimare[i]
}
' dosar
Rețineți că sortează în funcție de valoarea lexicală a tot ce urmează după ultimul /
- deci dacă formatul este Autor-<numele autorului>-<titlu>.<extensie>
o sa fie
- coarda fixă
Autor-
(care nu are efect, deoarece are aceeași greutate pentru toate liniile); atunci
<numele autorului>-
; atunci
<titlu>.
; atunci
<extension>
Acest lucru este similar cu GNU fel
este simplu KEYDEF -t- -k2
funcționează, adică cheia de sortare efectivă începe de la <author name>
și continuă până la capătul liniei.
Un delimitator explicit este omis din Despică
apeluri astfel încât să moștenească valoarea de FS
, ceea ce facilitează schimbarea pentru sistemele care utilizează un separator de cale diferit. Șirurile goale atașate ""
în mycmp
funcția forțează comparația lexicală chiar dacă numele fișierelor sunt numerice - vezi de exemplu Cum se convertește awk între șiruri și numere
Dacă preferați să rămâneți cu fel
comandă, puteți folosi GNU awk Comunicații bidirecționale cu un alt proces la:
- duplicați ultimul
/
-câmp separat la începutul șirului
- trece rezultatul la a
fel
comanda
- citiți înapoi rezultatul sortat, eliminați prefixul duplicat și imprimați
adică
gawk -F/ '
ÎNCEPE {OFS=FS; cmd = "sortare -d"}
{printați $NF $0 |& cmd}
SFÂRŞIT {
close(cmd,"la");
while(cmd |& getline){$1 = ""; imprimare};
close(cmd,"de la")
}
' dosar
Există un pic de înșelăciune aici în sensul că căile absolute (liniile încep cu /
) implică un câmp inițial gol; pentru a gestiona căile relative pe care ar trebui să le schimbați imprimați $NF $0
la imprimați $NF, $0
pentru a insera separatorul „lipsă” și apoi poate utilizați o expresie regex sub()
în loc de cel mai simplu $1 = ""
pentru a îndepărta elementul conducător.
Pe lângă faptul că ar putea fi mai rapid/mai eficient în memorie decât cel pur bălălău
soluție, aceasta permite altele fel
opțiuni care trebuie adăugate direct ex. cmd = "sortare -d -t " FS " -k1,1r"
.