Tekstitiedoston rivien käsittely bashissa

Anonyymi

Mikähän olisi näppärin tapa lisätä tekstitiedoston jokaisen rivin eteen tietty määrä merkkejä, kuten välilyöntejä? Pitääkö käydä silmukassa jokainen rivi erikseen, ja echottaa halutut merkit ensin ja perään itse rivi?

Tiedostoa ei tarvitse tai pidä muuttaa, vaan lopputulos on tarkoitus liittää osaksi uutta tiedostoa.

25

206

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Voihan sitä kokeilla vaikka näinkin:

      input="a.txt" && while IFS= read -r line; do echo "merkit$line" >> b.txt; done < "$input"

      On tuosta varmaan mahdollisuus lyhentääkin jotenkin.
      — a.txt = alkuperäinen tiedosto
      — "merkit$line" = merkit on lisättävät merkit ja $line = luettu rivi vanhasta tiedostosta ja yhdessä muodostavat uuden rivin uuteen tiedostoon.
      — b.txt on uusi tiedosto.

      • Anonyymi

        mv tiedostoalkup.txt tiedostouus.txt


    • Anonyymi

      Sedillä käy aika kätevästi. Tuossa on 1234 lisättävä merkkijono.

      sed 's/^/1234/' tiedosto.txt

      • Anonyymi

        No tuosta se tuskin lyhenee, kokonaisuudessaan tuo SED

        sed 's/^/1234/' a.txt >> b.txt


    • Anonyymi

      Kiitokset. Tuo sed on juuri sopiva tähän käyttöön.

      Entä mahtaiskohan millä menetelmällä pystyä määrittämään tekstitiedoston viimeisen rivin "aloituskohdan", eli kuinka monta välilyöntiä tai sarkainta on ennen muita merkkejä?

      Aikaisemman kysymyksen tiedoston rivien etumerkkien määrä perustuu toisen tiedoston viimeiseen riviin, lisätään siis sen toisen tiedoston jatkeeksi.

      • Anonyymi

        Komento awk sopii tuohon käyttöön. Esimerkki laskee tiedoston viimeisen rivin alusta sekä välilyönnit että tabulaattorit. Muokkamalla hakasulkujen välissä olevaa kohtaa voi laskea pelkästään välilyönnit [^ ] tai tabulaattorit [^\t], tai mitä sitten haluaakaan.

        awk -F'[^ ^\t]' 'END{print length($1)}' tiedosto.txt


    • Anonyymi

      Jos tiedetään kuinka monta kertaa merkki tai merkkijono halutaan tulostaa rivin alkuun, niin sen voi tehdä echo-komennolla:

      echo -e ''$_{1..4}'\b=' \\bloppurivi

      ====loppurivi

      Komentorivissä aaltosulkeiden välissä oleva jälkimmäinen luku (tässä '4') määrittää kuinka monta kertaa merkki/merkkijono (tässä '=') tulostetaan. Kannattaa huomata että rivin loppu pitää tosiaan liittää kiinni kohtaan '...\\b'.

      • Anonyymi

        Echottaessa muuten jos haluaa käyttää välilyöntiä rivin alussa pitää käyttää välilyönnin heksakoodia 20. Jos laittaa välilyönnin lainausmerkkeihin " ", niin se jää pois alusta. Tuo tulostaa neljä tyhjää rivin alkuun.

        echo -e $(for each in $(seq 1 4); do echo -n "\x20"; done)loppuosa


    • Anonyymi

      En ole varma mitä halusit, mutta jos se oli, että halusit tietää montako ei näkyvää merkkiä on tiedoston viimeisen rivin alussa, niin näin se vastaus löytyy:

      c=$( sed -n -e '$p' a.txt ) | b=`echo ${c}` | ((x = ${#c}-${#b})) | echo $x

      a.txt on se tiedosto, jonka viimeisestä rivistä näiden ei näkyvien merkkien määrä tässä selvitetään. Muut muuttujat ovat vain laskennan apuna.

      T. Urpo

      • Anonyymi

        Taas minä ketjutin tuon väärin pitää vaihtaa | merkit näihin &&
        eli tee se näin:

        c=$( sed -n -e '$p' a.txt ) && b=`echo ${c}` && ((x = ${#c}-${#b})) && echo $x

        Tämä ei ollut ensimmäinen ketjutus virheeni, eikä varmaan viimeinenkään. Kun tuollaisen testaa lause lauseelta, ja lopuksi ketjuttaa yksi riviseksi jostain kumman syystä tulee aina laitettua tämä | vaikka pitäisi laittaa tämä &&.

        Kumma ettei kukaan kerinnyt huomauttamaan. Siinä muuten on hieno yksityiskohta, nimittäin echo komento toimii TRIM funktiona ( b=`echo ${c}` ) . ECHO komennon pitäisi tulostaa koko merkkijono, mutta sepä ei sitä teekään silloin kun merkkijonon alussa on välilyöntejä echo jättää ne pois, sen vuoksi tässä saadaan b -muuttujaan suodatettu viimeinen rivi, jonka pituus sitten vähennetään kokonaisesta rivistä ($c).


      • Anonyymi
        Anonyymi kirjoitti:

        Taas minä ketjutin tuon väärin pitää vaihtaa | merkit näihin &&
        eli tee se näin:

        c=$( sed -n -e '$p' a.txt ) && b=`echo ${c}` && ((x = ${#c}-${#b})) && echo $x

        Tämä ei ollut ensimmäinen ketjutus virheeni, eikä varmaan viimeinenkään. Kun tuollaisen testaa lause lauseelta, ja lopuksi ketjuttaa yksi riviseksi jostain kumman syystä tulee aina laitettua tämä | vaikka pitäisi laittaa tämä &&.

        Kumma ettei kukaan kerinnyt huomauttamaan. Siinä muuten on hieno yksityiskohta, nimittäin echo komento toimii TRIM funktiona ( b=`echo ${c}` ) . ECHO komennon pitäisi tulostaa koko merkkijono, mutta sepä ei sitä teekään silloin kun merkkijonon alussa on välilyöntejä echo jättää ne pois, sen vuoksi tässä saadaan b -muuttujaan suodatettu viimeinen rivi, jonka pituus sitten vähennetään kokonaisesta rivistä ($c).

        Mainittakoon että rivin lopussa ei saa olla välilyöntejä, vai rivin alussa, muutoin lasku antaa virheellisen tuloksen. Eli hiomista jäi jos ken haluaa parantaa.

        T. Urpo


      • Anonyymi
        Anonyymi kirjoitti:

        Mainittakoon että rivin lopussa ei saa olla välilyöntejä, vai rivin alussa, muutoin lasku antaa virheellisen tuloksen. Eli hiomista jäi jos ken haluaa parantaa.

        T. Urpo

        Mainittakoon että se parannus tulisi kohdistaa juuri tuohon ECHO komennon virheellisen tulostuksen hyödyntämiseen, eli tämä osuus tuli tehdä toisin:

        && b=`echo ${c}` &&

        b$ muuttujaan tulisi siirtää c$ muuttujasta vain edestä TRIMMATTU merkkijono, kun se tässä TRIMMATAAN edestä ja takaa, toimii jos ei rivin loput sisällä välilyöntejä. Tämä meni snoppailuksi tällä kertaa.

        T. Urpo


      • Anonyymi
        Anonyymi kirjoitti:

        Taas minä ketjutin tuon väärin pitää vaihtaa | merkit näihin &&
        eli tee se näin:

        c=$( sed -n -e '$p' a.txt ) && b=`echo ${c}` && ((x = ${#c}-${#b})) && echo $x

        Tämä ei ollut ensimmäinen ketjutus virheeni, eikä varmaan viimeinenkään. Kun tuollaisen testaa lause lauseelta, ja lopuksi ketjuttaa yksi riviseksi jostain kumman syystä tulee aina laitettua tämä | vaikka pitäisi laittaa tämä &&.

        Kumma ettei kukaan kerinnyt huomauttamaan. Siinä muuten on hieno yksityiskohta, nimittäin echo komento toimii TRIM funktiona ( b=`echo ${c}` ) . ECHO komennon pitäisi tulostaa koko merkkijono, mutta sepä ei sitä teekään silloin kun merkkijonon alussa on välilyöntejä echo jättää ne pois, sen vuoksi tässä saadaan b -muuttujaan suodatettu viimeinen rivi, jonka pituus sitten vähennetään kokonaisesta rivistä ($c).

        Mitä tuon pitäisi tulostaa? Kokeilin ja se tulosti viimeisen rivin ilman alun väilyöntejä ensimmäiseen seuraavaan välilyöntiin saakka.

        Alussa olevien tyhjien määrän saa selville siis esimerkiksi awk:lla.

        awk -F'[^ ^\t]' 'END{print length($1)}' tiedosto.txt


      • Anonyymi
        Anonyymi kirjoitti:

        Mitä tuon pitäisi tulostaa? Kokeilin ja se tulosti viimeisen rivin ilman alun väilyöntejä ensimmäiseen seuraavaan välilyöntiin saakka.

        Alussa olevien tyhjien määrän saa selville siis esimerkiksi awk:lla.

        awk -F'[^ ^\t]' 'END{print length($1)}' tiedosto.txt

        Toimiihan tuo, mitä sinä höpötät. Tämä on itse tehty, eikä verkosta kopioitu.

        — c=$( sed -n -e '$p' a.txt ) #viimmeinen rivi muuttujaan $c
        — b=`echo ${c}` #muuttuja $c suodatettuna, muuttujaan $b
        — ((x = ${#c}-${#b})) #lasketaan erotus muuttujaan $x
        — echo $x #tulostetaan muuttujan $x arvo.

        T. Urpo


      • Anonyymi
        Anonyymi kirjoitti:

        Toimiihan tuo, mitä sinä höpötät. Tämä on itse tehty, eikä verkosta kopioitu.

        — c=$( sed -n -e '$p' a.txt ) #viimmeinen rivi muuttujaan $c
        — b=`echo ${c}` #muuttuja $c suodatettuna, muuttujaan $b
        — ((x = ${#c}-${#b})) #lasketaan erotus muuttujaan $x
        — echo $x #tulostetaan muuttujan $x arvo.

        T. Urpo

        Ei toiminut. Tiedostoni viimeinen rivi oli:

        "    drwxr-xr-x 2 jorma jorma 4096 tammi 16 2019 Videos"

        Tuossa on siis alussa neljä välilyöntiä ennen drwx... osuutta. Ja tuo sinun viritelmäsi palautti:

        "drwxr-xr-x: command not found"

        Toimivaksi todettu awk-komentoon perustuva versio taas palauttaa 4.


      • Anonyymi
        Anonyymi kirjoitti:

        Ei toiminut. Tiedostoni viimeinen rivi oli:

        "    drwxr-xr-x 2 jorma jorma 4096 tammi 16 2019 Videos"

        Tuossa on siis alussa neljä välilyöntiä ennen drwx... osuutta. Ja tuo sinun viritelmäsi palautti:

        "drwxr-xr-x: command not found"

        Toimivaksi todettu awk-komentoon perustuva versio taas palauttaa 4.

        Niin palauttaa tuokin minun tekemä.


      • Anonyymi
        Anonyymi kirjoitti:

        Niin palauttaa tuokin minun tekemä.

        Ei palauta.


      • Anonyymi
        Anonyymi kirjoitti:

        Ei palauta.

        Valehtelet


      • Anonyymi
        Anonyymi kirjoitti:

        Valehtelet

        Turhaan jankkaat. Se virityksesti toimi juuri kuten aikaisemmin mainitsin. En suosittele sinulle uraa tietokoneiden kanssa, jos et edes testauksen alkeita osaa.


      • Anonyymi
        Anonyymi kirjoitti:

        Turhaan jankkaat. Se virityksesti toimi juuri kuten aikaisemmin mainitsin. En suosittele sinulle uraa tietokoneiden kanssa, jos et edes testauksen alkeita osaa.

        Ei kukaan sinun suosituksiasi kaipaa, usko pois. Tuommoista se on kun toisten tekemiä jaetaan omanaan, ei sitten osata eikä ymmärretä mitään, siitä mitä levitellään, kunhan vaan jankutetaan ja jankutetaan, mistään mitään ymmärtämättä.

        Työnnä ahteriisi ne suosituksesi, ei niillä taitamattoman suosituksilla muuta arvoa ole.


      • Anonyymi
        Anonyymi kirjoitti:

        Ei kukaan sinun suosituksiasi kaipaa, usko pois. Tuommoista se on kun toisten tekemiä jaetaan omanaan, ei sitten osata eikä ymmärretä mitään, siitä mitä levitellään, kunhan vaan jankutetaan ja jankutetaan, mistään mitään ymmärtämättä.

        Työnnä ahteriisi ne suosituksesi, ei niillä taitamattoman suosituksilla muuta arvoa ole.

        Jotkut osaavat, sinä et.


      • Anonyymi
        Anonyymi kirjoitti:

        Jotkut osaavat, sinä et.

        Jäkäti jäkäti...


    • Anonyymi

      Heh. Kyllähän tuo, mutta kuka muistaa ohjelman nimeltä edlin?

      • Anonyymi

        Mini tuntu heti tutulta, olenhan minä sitä joskus käyttänyt, en vaan muista siitä enää yksityiskohtaisia kokemuksia.

        T. Urpo


      • Anonyymi

        Minä muistan edlinin, hyvin kankea editoriksi. Edit on paljon parempi MSDOS-ympäristössä.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. SDP haluaa LISÄÄ veroja bensa-autoille!

      Sdp:n vaihtoehtobudjetti esittää polttomoottoriautoille lisää veroja Sdp esittää tuoreessa vaihtoehtobudjetissaan verot
      Maailman menoa
      199
      17683
    2. Riikka se jytkytti BKT:stä nyt 0,3 prosenttia pois

      Ja vain kolmessa kuukaudessa! Vuositasollahan tuo tarkoittaa reilun prosentin pudotusta. Pärjäisi varmaan lasketteluss
      Maailman menoa
      52
      10137
    3. Vasemmistoaate on aatteista jaloin

      Kaikki saavat ja kukaan ei jää ilman. Kuka tuollaista voisi vastustaa?
      Maailman menoa
      206
      6346
    4. Persut: haluamme lisää veroja!

      Lisää lisää veroja huutaa persukuoro. Veroila Suomi nousuun! "Uusi matkailuvero eli matkailijamaksu peritään esimerki
      Maailman menoa
      1
      4342
    5. Antti Lindtman kiitti valtiovarainministeri Purraa

      Ministeri Purra kertoi ottavasa vastuun EU:n alijäämämenettelyyn joutumisesta. Hän myös sanoi tietävänsä, että Lindtman
      Perussuomalaiset
      48
      3269
    6. Brittiläinen vasemmistolehti: Sanna Marin oli vihdoin rehellinen

      Nyt tulee pahasti lunta tupaan Seiskan tähtitytölle. Ex-pääministerin kirjaa arvostellaan latteuksista ja itsekehusta.
      Maailman menoa
      56
      2983
    7. Suomalaisten enemmistö on (ateisteja / fiksuja / sosialisteja)

      Tai jokin noiden yhdistelmä, koska S-ryhmän markkinaosuus päivittäistavarakaupasta on yli 50 prosenttia.
      Maailman menoa
      27
      2967
    8. "Purra löylytti oppositiota", sanoi naistoimittaja Pöllöraadissa

      Kyllä, Purra tekee juuri sitä työtä mitä hänen tuossa asemassa pitää tehdä, hän antaa oppositiolle takaisin samalla mita
      Maailman menoa
      70
      2776
    9. Henkilökohtaisia paljastuksia Dubaista - Kohujulkkis Sofia Belorf on äitipuoli ja puoliso!

      Tiesitkö, että Sofia on äitipuoli ja rakastava puoliso? Sofia Belorf saa oman sarjan, jossa seurataan hänen Bling Bling
      Kotimaiset julkkisjuorut
      88
      2730
    10. Alexander C. G. riisti demari-Veijolta arvonimen

      "Stubb myönsi 66 arvonimeä ja peruutti yhden arvonimen. Presidentti Tarja Halonen myönsi Baltzarille kulttuurineuvoksen
      Maailman menoa
      56
      2212
    Aihe