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 feleste 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" .