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