Kirjoittaja Aihe: Komentorivikikkailua (oli: Apuja greppailuun)  (Luettu 4270 kertaa)

dotsi

  • Käyttäjä
  • Viestejä: 112
    • Profiili
Komentorivikikkailua (oli: Apuja greppailuun)
« : 23.04.07 - klo:17.05 »
Terve,

Minulla on eräässä hakemistossa koko läjä tekstitiedostoja, joista jokaisesta haluaisin poistaa nollalla alkavat rivit. Ymmärsin, että komento
Koodia: [Valitse]
grep -v "^0"tekee juuri tämän, mutta kuinka saan sen läpikäymään kaikki hakemiston tiedostot?
« Viimeksi muokattu: 04.05.07 - klo:11.01 kirjoittanut dotsi »

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Apuja greppailuun
« Vastaus #1 : 23.04.07 - klo:18.07 »
Grep ei poista tiedostoista mitään vaan ainoastaan näyttää (tai jättää näyttämättä ) ehdon täyttävät rivit. Jos haluat muokata tiedostoja niin sen voit tehdä sed:n avulla.

Koodia: [Valitse]
Poistetaan nollalla alkavat rivit tiedostossa "tiedostonimi"
$ sed -i '/^0/d' tiedostonimi

Poistetaan nollalla alkavat rivit kaikissa hakemiston tiedostoissa
$ sed -i '/^0/d' *

Poistetaan nollalla alkavat rivit kaikissa .txt-päätteisissä tiedostoissa
$ sed -i '/^0/d' *.txt

dotsi

  • Käyttäjä
  • Viestejä: 112
    • Profiili
Vs: Apuja greppailuun
« Vastaus #2 : 23.04.07 - klo:18.25 »
Kiitoksia erittäin paljon!

dotsi

  • Käyttäjä
  • Viestejä: 112
    • Profiili
Vs: Komentorivikikkailua (oli: Apuja greppailuun)
« Vastaus #3 : 04.05.07 - klo:11.12 »
Jatkan tähän saman (uudelleennimetyn) aiheen alle, koska en pidä järkevänä aloittaa uutta keskustelua jokaisesta eteentulevasta ongelmastani, ne kun kuitenkin liippaavat toisiaan aika likeltä.

Minulla on tosiaan edelleen koko joukko noita tekstitiedostoja, joissa kussakin on lukuisia rivejä. Yksi rivi voi näyttää esimerkiksi tältä:

Koodia: [Valitse]
8 | 10 | 61.064625 | 28.090907
(kyseessä siis GPS-vastaanottimen paikanmäärityksessä käyttämät satelliitit, kaikki taivaalla sillä hetkellä näkyvät satelliitit, sekä niiden avulla laskettu sijainti)

Oleellinen luku tuossa tapauksessa on tuo 10, se on yhdessä tiedostossa joka rivillä sama. Haluaisinkin nyt käydä läpi kaikki (tai erikseen määriteltävät) tiedostot tulostaa kustakin tiedostosta vaikka viimeiseltä riviltä vain tuon 10:n (tai mikä se kussakin tiedostossa sattuu olemaan) tuolta "putkien" välistä erilliseen tiedostoon, josta ne olisi mahdollisesti helpompaa kopioda taulukkolaskentaan tms. Onnistuukohan?

Olen jälleen erittäin kiitollinen mahdollisesta avustanne.

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Komentorivikikkailua (oli: Apuja greppailuun)
« Vastaus #4 : 04.05.07 - klo:12.37 »
Koodia: [Valitse]
8 | 10 | 61.064625 | 28.090907
Oleellinen luku tuossa tapauksessa on tuo 10, se on yhdessä tiedostossa joka rivillä sama.
Haluaisinkin nyt käydä läpi kaikki (tai erikseen määriteltävät) tiedostot tulostaa kustakin tiedostosta vaikka viimeiseltä riviltä vain tuon 10:n (tai mikä se kussakin tiedostossa sattuu olemaan) tuolta "putkien" välistä erilliseen tiedostoon, josta ne olisi mahdollisesti helpompaa kopioda taulukkolaskentaan tms. Onnistuukohan?

Ensimmäisen rivin tiedostosta saa komennolla
Koodia: [Valitse]
$ head -n1 tiedosto.txt
ja vastaavasti viimeisen komennolla
Koodia: [Valitse]
$ tail -n1 tiedosto.txt

Periaatteessa tässä tapauksessa on järkevämpää käyttää ensimmäistä vaihtoehtoa sillä silloin ei tarvitse lukea koko tiedostoa.

Taulukkolaskin todennäköisesti lukee varsin kiltisti "|"-merkeillä erotettua tietoa mutta jos haluat poimia tuon toisen sarakkeen niin se onnistuu komennolla
Koodia: [Valitse]
$ cut -d '|' -f 2

Tällä komennolla mukaan tulevat myös välilyönnit joten jos et halua niitä niin sitten kannattaa suodattaa ne pois jossain välissä esimerkiksi komennolla
Koodia: [Valitse]
$ tr -d ' '

Jos haluat pelkästään nuo toisen sarakkeen arvot esimerkiksi jokaisesta gps-päätteisestä tiedostosta uuteen tiedostoon niin se onnistuu loitsulla
Koodia: [Valitse]
$ head -n1 *.gps | cut -d '|' -f 2 | tr -d ' ' >gps-arvot.txt

dotsi

  • Käyttäjä
  • Viestejä: 112
    • Profiili
Vs: Komentorivikikkailua (oli: Apuja greppailuun)
« Vastaus #5 : 04.05.07 - klo:15.26 »
Kiitoksia jälleen erittäin paljon  ;D

dotsi

  • Käyttäjä
  • Viestejä: 112
    • Profiili
Vs: Komentorivikikkailua (oli: Apuja greppailuun)
« Vastaus #6 : 05.05.07 - klo:13.52 »
Entäpä kuinka muutan tr:llä rivinvaihdot välilyönneiksi?

Koodia: [Valitse]
tr \n ' '
ei ainakaan näyttänyt toimivan.

edit:
Koodia: [Valitse]
tr "\n" " "
toi ratkaisun :)
« Viimeksi muokattu: 05.05.07 - klo:13.59 kirjoittanut dotsi »

eDIT

  • Käyttäjä
  • Viestejä: 319
    • Profiili
Vs: Komentorivikikkailua (oli: Apuja greppailuun)
« Vastaus #7 : 16.07.07 - klo:02.10 »
Tarvitsisin myös hieman apua.

Erään ohjelman tulosteessa on  tämän näköisiä rivejä:

Koodia: [Valitse]
Drop.jpg        6400

jossa tuo "Drop.jpg" on tietysti tiedoston nimi ja perässäoleva luku tiedoston koko. Ja nyt mun pitäisi saada tuo tiedoston koko tuolta perästä pois. Ei siinä mitään, sen kekseinkin miten sen saa tehtyä:

Koodia: [Valitse]
cut -d ' ' -f 1 | tr -d ' '
mutta mitäs sitten, jos tiedostonimessä onkin välilyönti? Silloinhan tuo komento antaa nimen ensimmäisen osan välilyöntiin saakka?

Eli milläs komennolla saisi näyttämään koko tiedostonimen?

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Komentorivikikkailua (oli: Apuja greppailuun)
« Vastaus #8 : 16.07.07 - klo:02.34 »
Erään ohjelman tulosteessa on  tämän näköisiä rivejä:
Koodia: [Valitse]
Drop.jpg        6400

Eli milläs komennolla saisi näyttämään koko tiedostonimen?

Poistetaan rivin lopusta numerot ja muu ylimääräinen tauhka.

Koodia: [Valitse]
sed 's/[[:space:]]*[0-9]\+[[:space:]]*$//'

Tämän pitäisi olla melko varmatoiminen viritys joka ei nirsoile vaikka rivin lopussa olisi ylimääräisiä whitespace-merkkejä. Varmuuden vuoksi tiedostonimen ja luvun välistäkin syödään whitespace-merkit pois koska erottimena saattaa olla joko välilyöntejä tai tabulaattori.