Sivu 1/1

Tekstitiedoston muokkausta

Lähetetty: 27.1.2017 klo 9.27
Kirjoittaja pv2010
Kyselin muutama vuosi sitten vinkkiä koordinaattitietoja sisältävän tekstitiedoston muokkaamiseksi rivejä poistamalla, ja sainkin siihen hyvän awk-komento-ohjeen: http://hopeinenomena.net/viewtopic.php?f=40&t=190143.

1) Nyt olisi samankaltainen ongelma.
Tiedosto sisältää x, y- ja z-koordinaatteja, yhden pisteen koordinaatit yhdellä rivillä, pilkulla ja välilyönnillä erotettuna, esim:
6101.93587955, 2199.79205609, 81.40916867, 1,
(Tuo lopun ", 1," on sellainen, mistä myös pitäisi päästä eroon. Siihen liittyy joitakin omituisuuksia, joista jäljempänä.)

Lukujen yksikkö on metri, joten tarkkuus on millin 100 000. osa. Löytyisikö jokin Pääte-ohjelman komento, jolla desimaalipisteen jälkeen pidetään vain kolme lukua ja loput poistetaan, mutta vain pilkkuun asti, ja seuraavalle luvulle sama operaatio, samoin viimeiselle. Lopputulos näyttäisi tältä (ilman viimeistä lukua 1):
6101.935, 2199.792, 81.409
Jotenkin siis että "säilytä pisteen jälkeen kolme merkkiä, poista loput kunnes tulee pilkku".


2) Palatakseni tuohon rivin viimeiseen lukuun 1. Sain sen vielä eilen poistettua komennolla:

Koodi: Valitse kaikki

awk '{$4 = ""; print}' tiedosto1.txt > tiedosto2.txt
Tuon pitäisi poistaa 4. sarake, jollaiseksi awk aina pilkun jälkeisen tekstin tunnistaa, mutta eilen loppupäivästä ja tänään se ei toimikaan. Uusi tiedosto kyllä syntyy, mutta viimeisen sarakkeen poisto on tehty vain 1. riville, ja vielä siten, että "1," on poistettu, samoin 2-rivin ensimmäinen sarake eli x-koordinaatti. 2-rivi Y-koordinaatista alkaen on 1-rivillä. Alunperin kolmen ensimmäisen rivin ryhmä näytti tältä:
6101.93587955, 2199.79205609, 81.40916867, 1,
6095.95898438, 2200.40478516, 81.34080505, 1,
6100.87402344, 2207.15954590, 81.26097107, 1

Nyt tältä:
6101.93587955, 2199.79205609, 81.40916867, 2200.40478516, 81.34080505, 1,
6100.87402344, 2207.15954590, 81.26097107, 1


Ja lisää ongelmia...
Lähtötiedostossa on myös tyhjiä rivejä. Enää ei toimi myöskään niiden poisto komennolla:

Koodi: Valitse kaikki

awk 'NF > 0' tiedosto1.txt > tiedosto2.txt
Eilen sen jälkeen kun lopun ylimääräinen ", 1," oli poistettu, sain myös onnistuneesti poistettua kunkin rivin lopusta viisi viimeistä merkkiä komennolla:

Koodi: Valitse kaikki

sed 's/.....$//' tiedosto1.txt > tiedosto2.txt
Tällä sain z-koordinaatista karsittua turhia desimaaleja. Viisi pistettä vastaa viittä mitä tahansa merkkiä. Tänään komento toimiikin niin, että se tehdään vain tiedoston loppuun, eli viimeiselle riville, eikä joka riville kuten eilen.

Voiko Päätteessä olla joku yleissäätö, joka vaikuttaa siten, että komennot tehdään vain kerran? Olen copy-pastennut komentoja tai selannut niitä Päätteen komentohistoriasta. Mutta eivät toimi.

Kiitos kaikesta avusta!

Re: Tekstitiedoston muokkausta

Lähetetty: 27.1.2017 klo 9.45
Kirjoittaja pv2010
Vähän lisäselvennystä asiaan.
Seuraava komento tulostaa viimeisen sarakkeen Pääte-ikkunaan:

Koodi: Valitse kaikki

awk '{print $(NF)}' tiedosto.txt

Kokeilin sitä tekstitiedostolle joka eilen toimi ja tiedostolle joka ei toimi. Toimivasta tiedostosta tulostui tosiaan joka rivin viimeinen sarake, toimimattomasta koko tiedoston viimeinen sarake, eli yksi arvo.
Molemmat tekstitiedostot on copy-pastettu Texturiin samalla tavalla ja Texturissa tiedosto on pelkkää tekstiä, ei RichTextFormatissa. Ja molemmissa rivin lopussa pilkun jälkeen ei ole tosiaan mitään merkkiä. Ja teksti rivittyy oikein, eli rivin lopussa on rivinvaihto.

Voisiko ongelma liittyäkin tekstin koodaukseen tai vastaavaan?

Re: Tekstitiedoston muokkausta

Lähetetty: 29.1.2017 klo 18.47
Kirjoittaja tkt
Rivinvaihtomerkit ovat väärin. Awk ja muut komentorivikomennot odottavat rivinvaihtomerkiksi 0x0a (newline). Perinteinen Mac rivinvaihto on ollut 0x0d (return) ja Windowsissa on käytetty yhdistelmää 0x0d 0x0a (return+linefeed),

Jos tiedosto on talletettu siten, että rivinvaihdot on merkitty vanhalla Macintosh-tyylillä, niin komentorivikomennot eivät tunnista rivejä.

Tiedoston merkkejä voi tarkastella esimerkiksi octal dump -komella.

Koodi: Valitse kaikki

kone:~ me$ od -ax tiedosto.txt 
0000000    y   k   s   i  nl   k   a   k   s   i  nl   k   o   l   m   e
             6b79    6973    6b0a    6b61    6973    6b0a    6c6f    656d
0000020   nl  nl                                                        
             0a0a
--Ari

Re: Tekstitiedoston muokkausta

Lähetetty: 10.2.2017 klo 9.33
Kirjoittaja pv2010
tkt kirjoitti:Rivinvaihtomerkit ovat väärin. Awk ja muut komentorivikomennot odottavat rivinvaihtomerkiksi 0x0a (newline). Perinteinen Mac rivinvaihto on ollut 0x0d (return) ja Windowsissa on käytetty yhdistelmää 0x0d 0x0a (return+linefeed),

Jos tiedosto on talletettu siten, että rivinvaihdot on merkitty vanhalla Macintosh-tyylillä, niin komentorivikomennot eivät tunnista rivejä.
Kiitos vinkistä. Löyisinkin siihen lisää apua: https://developer.apple.com/library/con ... 03518-SW10
Ja siellä kun näin kohdan: "Important: Be sure to save this file with UNIX-style line endings...", ja edelleen:
https://developer.apple.com/library/con ... 03517-SW37
Kohta 'Cross-Platform Line Endings'. Taulukosta Listing 10-2 löytyi komento:

Koodi: Valitse kaikki

tr '\r' '\n' < mac_text_file > unix_text_file
Sillä toimi. Hienoa!

Tällä siis ratkesi kohdan 2 ongelma. Kohta 1 (koordinaattien desimaalien vähentäminen) on vielä avoin, mutta olenkin jo tehnyt homman, eli hyväksyin sen että koordinaatteja oli tarpeettoman paljon. Mutta jos joku tietää miten vähentäminen onnistuu, kiitollisena otan tiedon vastaan tulevaisuuden varalle.

Re: Tekstitiedoston muokkausta

Lähetetty: 10.2.2017 klo 11.13
Kirjoittaja homenamsi
Yksi vaihtoehto olisi TextWrangler tai BBEdit ohjelma - tulevat samasta pajasta.

Unixin grepin 'säännölliset lausekkeet' onnistuvat, erilaisten rivipäätteiden (LF|CR+LF|LF+CR|CR|...) mulkkaus niinikään, kaikki erikoismerkit jne. Muokkauskomennon voi kohdistaa useampaan tiedostoon kerralla jne.

Monasti olen pulaillut TextWranglerilla ja Excelillä kun olen joutunut poistamaan jotain kenttiä vastaavien rivirimpsujen keskeltä. Copy/Paste edestakaisin niin, että luvut menevät eri sarakkeisiin Excelissä. Tabulaattorimerkkejä voi joutua välillä vaihtelemaan pilkuiksi ja päinvastoin kun tuo suomenkielinen Excel ei osaa käsitellä CSV-tiedostoja vaan panee erottimeksi pilkun sijasta puolipisteen. :'(