Bir çözüm - * RS değişkenlerini değiştirenler kadar zarif değil, belki de oldukça net:
PATH=`awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null`
Tüm program BEGIN ve END bloklarında çalışır. PATH değişkeninizi ortamdan çekerek birimlere böler. Daha sonra, sonuç dizisi p'yi (sırayla yaratılır split()
) tekrar eder. Dizi E şu andaki yol elementi (örneğin seen olup olmadığını belirlemek için kullanılan bir birleştirici dizidir / usr / yerel / bin öncesi), ve değilse, eklenen np bir kolon eklemek için mantığı ile, np içinde zaten bir metin varsa np . SON blok basitçe yankılar np . Bu ekleyerek daha da basitleştirilebilir-F:
bayrak, üçüncü argüman ortadan kaldırarak split()
(için varsayılan olarak olarak FS ve değiştirme) np = np ":"
için np = np FS
bize veren:
awk -F: 'BEGIN {np="";split(ENVIRON["PATH"],p); for(x=0;x<length(p);x++) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np FS; np=np pe}} END { print np }' /dev/null
Doğal olarak, bunun for(element in array)
düzeni koruyacağına inandım , ancak öyle olmaz, bu yüzden asıl çözümüm işe yaramaz, çünkü eğer biri aniden birisinin düzenini karıştırırsa, halk üzülecektir $PATH
:
awk 'BEGIN {np="";split(ENVIRON["PATH"],p,":"); for(x in p) { pe=p[x]; if(e[pe] != "") continue; e[pe] = pe; if(np != "") np=np ":"; np=np pe}} END { print np }' /dev/null