2009-04-25

Konwersja plików tekstowych z Windows do Linuksa - problem końca linii

Potrzeba matką wynalazku. Na zajęciach z Symulacji Komputerowych kazano nam tworzyć pliki inputowe do Gaussiana pod Windowsem i następnie wczytywać je (tzn. oczywiście Gaussian je wczytywał) pod Linuksem. Niestety nie wczytywały się poprawnie ponieważ Windows i Linux inaczej zapisuje i interpretuje koniec linii (otóż pod Windowsem koniec linii jest oznaczany tzw. znakiem carriage return, zwanym po polsku znakiem powrotu karetki). Zaistniała zatem potrzeba konwersji plików tekstowych z Windows do Linuksa - a dokładniej tylko konwersji znaku końca linii. Najprościej byłoby użyć programu dos2unix, niestety nie na swoim serwerze nie mam możliwości instalacji oprogramowania. Poszperałem trochę po sieci i znalazłem ciekawą stronę opisującą rozwiązanie problemu - How do I convert between Unix and Windows text files?.

Najprostsze wydawało mi się użycie tr. Aby usunąć z pliku tekstowego Windowsowe znaki końca linii należy wydać polecenie:

tr -d '\15\32' < winfile.txt > unixfile.txt

Teraz wystarczyło tylko zrobić prosty skrypcik:

#!/bin/bash
cp $1 $1.tmp
rm $1
tr -d '\15\32' < $1.tmp > $1
rm $1.tmp
clear


i uruchomić go poleceniem:

./kkl plik.inp

i wszystko gra :-)

Alternatywą jest posłużenie się programem awk.

Konwersja pliku Windows->Linux:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

Konwersja pliku Linux->Windows:

awk 'sub("$", "\r")' unixfile.txt > winfile.txt

4 komentarze:

  1. mozna uzyc gotowych binarek dos2unix i unix2dos...

    OdpowiedzUsuń
  2. sed -e 's/\r//' -i plik
    sed -e 's/$/\r/ -i plik

    OdpowiedzUsuń
  3. vim nazwapliku, a następnie:
    :set ff=dos
    lub
    :set ff=unix

    OdpowiedzUsuń
  4. smerf dobrze prawi - bez potrzeby kopiowania.
    a to konwertuje pliki z dos-a i mac-a:
    perl -pi -e 's/\r\n?/\n/g' plik
    a to na mac-a:
    perl -pi -e 's/\r?\n/\r/g' plik

    (sed potrafi operować tylko w ramach linii)

    OdpowiedzUsuń