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
mozna uzyc gotowych binarek dos2unix i unix2dos...
OdpowiedzUsuńsed -e 's/\r//' -i plik
OdpowiedzUsuńsed -e 's/$/\r/ -i plik
vim nazwapliku, a następnie:
OdpowiedzUsuń:set ff=dos
lub
:set ff=unix
smerf dobrze prawi - bez potrzeby kopiowania.
OdpowiedzUsuń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)