Awk – tulosta viimeinen sarake tai yksi ennen viimeistä, jos viimeinen on tyhjä

Haluan käyttää AWK saadaksesi tiedostonimi tai viimeisten kansioiden nimi, jos merkkijono on vain hakemisto.

Minulla on:

 awk -F "/" "{print $NF}" 

tulostaa viimeinen sarake ja:

 awk -F "/" "{print $(NF - 1)} 

tulostaa yksi sarake ennen viimeistä.

Kuinka voin tehdä awk tunnista, sisältääkö merkkijono vain hakemiston eikä tiedostonimeä, ja tulosta tässä tapauksessa yksi sarake ennen viimeistä.

Minun ongelmani on, että hakemisto saattaa näyttää tältä:

./folder1/folder2/folder3/ 

ja tässä tapauksessa viimeinen sarake olisi tyhjä. Haluan awk tunnistaa tämän ja tulostaa sitten folder3 (yksi sarake ennen viimeistä).

Vastaus

Voit käyttää joko if tai ?: -operaattoria tätä varten.

awk -F "/" "{print $NF == "" ? $(NF - 1) : $NF}" 
awk -F "/" "{if($NF == "") print $(NF - 1); else print $NF}" 

Kommentit

  • kolmikertainen operandi test ? true : false on fiksu valinta.

Vastaa

Katso myös GNU-apuohjelmien avulla:

xargs -rd "\n" basename -a -- 

Mikä list.txt -tulossa, kuten:

./folder1/folder2/folder3/ ./foo bar/// / 

antaa:

folder3 foo bar / 

zsh ”s :t muokkaaja (mistä: csh) antaa "" kohteelle "/" sijasta "/"

$ printf "<%s>\n" "${(@)${(f)$(<list.txt)}:t}" <folder3> <foo> <bar> <> 

Vastaa

kokeile

(En kuitenkaan pystynyt testaamaan sitä).

Vastaa

Kuoressa:

$ basename ./folder1/folder2/folder3/ folder3 

Määrittäminen muuttujaan käyttämällä basename muuttujalla, joka pitää sisällään polun nimi:

filename=$( basename "$pathname" ) 

basename -apuohjelma on vakio POSIX-apuohjelma .

Kommentit

  • thx, kysymykseni on kasvattanut hieman paljon , basename -sovelluksen käyttö on paljon yksinkertaisempaa.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *