Onko mahdollista luoda moniulotteisia taulukoita bash-komentosarjoissa?
Nämä ovat 3 matriisini :
arrayCITY=( NewYork LasVegas Detroit ) arraySTREET=( RoadStreet TreeStreet HighStreet ) arrayNUMBER=( 20 455 300 )
Haluan nyt laittaa nämä 3 taulukkoa vain yhteen matriisiin – onko tämä mahdollista? Sitten haluan näyttää ne txt-tiedostona. Nyt teen sen näin:
for ((i=0; i<${#arrayCITY[*]}; i++));do echo "${arrayCITY[i]} ${arraySTREET[i]} ${arrayNUMBER[i]}" >> TEXT.txt done
Vastaa
Lähettäjä man 1 bash
:
Arrays Bash provides one-dimensional indexed and associative array variables. Any variable may be used as an indexed array; the declare builtin will explicitly declare an array. There is no maximum limit on the size of an array, nor any requirement that members be indexed or assigned contiguously. Indexed arrays are referenced using integers (including arithmetic expressions) and are zero-based; associative arrays are referenced using arbitrary strings. Unless otherwise noted, indexed array indices must be non-negative integers.
Avainsana:
Bash tarjoaa yksiulotteiset indeksoidut ja assosiatiiviset taulukon muuttujat.
Joten ei, bash ei tue moniulotteisia taulukoita.
vastaus
törmäsin tähän juuri. On melko yksinkertainen ratkaisu, joka toimi minulle. Halusin käyttää laitteen avainkartan näyttämiseen taulukkoa, joka sisälsi laitteen nimen ja näytön sijainnin. Tein seuraavat: Yhdistin laitteen nimen ja siihen liittyvän näytön sijainnin yhdeksi merkkijonoksi käyttämällä erotinta (tapauksessani käytin .
), jonka tiesin esiintyvän missään arvossani. Sitten käytin cut
-sarjaa hajottaaksesi komposiittiarvot osiin tarvittaessa. Siihen voi olla puhtaampi ja yksinkertaisempi tapa, mutta tämä vain osoittaa, että voit luoda moniulotteisen taulukon tavallaan bash-muodossa, vaikka se ei tue sitä:
#!/bin/bash # List of devices and screen positions for key maps. DEV_LIST=( g13.+2560+30 g510s.+3160+30 g502.+2560+555 ) # This just echoes the device name and the screen position. for DEV in "${DEV_LIST[@]}"; do DEVICE=$(echo $DEV | cut -f1 -d.) SCREEN_POSITION=$(echo $DEV | cut -f2 -d.) echo "$DEVICE" echo "$SCREEN_POSITION" done exit
Tämä on jonkin verran samanlainen kuin Coop.Computerin vastaus .
Vastaus
Tässä on minulle sopiva ratkaisu. Jos asetamme taulukon ensin näin:
arrayCSR=( Placeholder_for_0_spot NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 )
Paikkamerkki on siellä välttääksesi 0-indeksin käsittelyä.
Sitten jokainen " rivi " on mitä tahansa jaettuna 3: lla, ja kukin " -sarakkeesta " on 1 tai 2 pienempi kuin " rivi " numero.
${arrayCSR[${3}]} is 20 ${arrayCSR[${2}]} is RoadStreet ${arrayCSR[${1}]} is NewYork
Alla on esimerkkikomentosarja:
arrayCSR=( CsR NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 ) for p in $( seq 1 ${#arrayCSR[*]} ) do if [[ "${arrayCSR[${p}]}" == "" ]] # Don"t run if empty then true elif [[ $((p % 3 )) -eq 0 ]] # We have 3 "columns" in the array then echo " ${arrayCSR[$(( p - 2 ))]} ${arrayCSR[$(( p - 1))]} ${arrayCSR[${p}]}" fi done
Joten mikä tahansa indeksi, joka voi jakaa 3: lla, tarkoittaa " riviä " ja myös rivin kolmas " sarake ". Saadaksesi toisen ja ensimmäisen " -sarakkeen ", vähennä 1 tai 2 vastaavasti.
Tämä voi myös suurentaa tarvittaessa.
Päivitys: Alla on koodi, jota käytän ladatessani ja järjestäessäni merkkijonojen korvauksia tiedostojen nimissä. Ensimmäinen taulukko ladataan tiedostosta ja jaetaan sitten kahteen erilliseen matriisiin.
readarray -t string_replace < ~/scripts/string_replace.lst # List of things to remove from name for p in $( seq 0 ${#string_replace[*]} ); do old_name_element[${p}]="${string_replace[${p}]%%,*}" new_name_element[${p}]="${string_replace[${p}]:$((${#old_name_element[${p}]}+1))}" done string_replace=() # Clear old array
Kommentit
- Se ' on siisti tapa väärentää 2D-taulukko, jos kaikkien elementtien pituus on tiedossa (ja johdonmukainen), mutta ei tietenkään toimi vaihtelevan pituisilla elementeillä.
- Minulle yksinkertainen tapa olisi käyttää vain 3 taulukkoa, jolloin hakemisto on niiden välinen yhteinen linkki.
Vastaa
Pidän Bashista niin paljon kuin onkin järkevää joskus vaihtaa muille kielille. Tämä on melko yksinkertaista käyttämällä Pythonin sanakirjaa:
#!/usr/bin/env python3 cities = { "New York": { "Street": "Roadstreet", "Number": 20 }, "Las Vegas": { "Street": "TreeStreet", "Number": 455 } } for city in cities: print(str(city) + ": " + str(cities[city]["Street"]) + " " + str(cities[city]["Number"]))
Tämän suorittaminen tuottaa:
./cities.py New York: Roadstreet 20 Las Vegas: TreeStreet 455