2017-09-04 4 views
0

Il existe un fichier volumineux dont les derniers symboles sont \r\n. Je dois les enlever. Cela semble être équivalent à supprimer la dernière ligne (?). UPD: non, ce n'est pas: un fichier n'a qu'une ligne, qui se termine par \r\n.AIX: supprime les derniers symboles (CRLF) d'un fichier

Je connais deux façons, mais les deux ne travaille pas pour AIX:

sed 's/\r\n$//' file # I don't why it doesn't work 
head -c-2 # head doesn't work with negative numbers 

est-il une solution pour AIX? Un grand nombre de fichiers volumineux doivent être traités, les performances sont donc importantes.

+0

Programme 'split (1)' serait une option ... Quelque chose comme ceci: 'export Fname = insertfilenamehere; Fsize = "$ (set -' ls -l $ Fname'; echo $ 5) "; export NewSize = $ (expr $ Fsize - 2); split -b "$ NewSize" - "$ Fname"; mv xaa $ {Fname} _ $ {NewSize} ' –

+1

' dos2unix file' peut être tout ce dont vous avez besoin. faites une copie de votre plus petit fichier de problème et testez-le. Avec de la chance, il va charger sans problème ou encore déconner. Notez que vous pouvez spécifier plusieurs fichiers en tant qu'arguments pour une invocation de 'dos2unix'. Bonne chance. – shellter

+0

Mon dernier commentaire a perdu son formatage, essayez ensuite: 'export Fname = insertfilenamehere; Fsize = "$ (set - $ (ls -l $ Fname); echo $ 5)"; export NewSize = $ (expr $ Fsize - 2); split -b "$ NewSize" - "$ Fname"; mv xaa $ {Fname} _ $ {NewSize} ' –

Répondre

0

Habituellement, si vous avez besoin d'éditer un fichier via un script en place, j'utilise ed pour des raisons historiques. Par exemple:

ed - /tmp/foo.txt <<EOF 
g/^$/d 
w 
q 
EOF 

ed est plus un peu revêche. Notez également que vous n'avez pas vraiment supprimé les lignes vides au bas du fichier mais plutôt toutes les lignes vides. Avec ed et une certaine pratique, vous pouvez probablement supprimer seulement les lignes vides au bas du fichier. par exemple. aller au bas du fichier, rechercher une ligne non vide, puis descendre une ligne et supprimer de ce point à la fin du fichier. ed les scripts de commande agissent (à peu près) comme vous vous en doutez. De plus, s'ils ont vraiment \ r \ n, alors ils ne seront pas considérés comme des lignes vides mais plutôt comme des lignes avec un contrôle-M (\ r). Vous devrez peut-être ajuster votre modèle si c'est le cas.

0

Ma réponse https://stackoverflow.com/a/46083912/3220113 à la question en double devrait fonctionner ici aussi. Une autre solution utilise

awk ' (NR>1) { print s } 
     {s=$0} 
     END { printf("%s",substr($2, 1, length($2)-1)) } 
    ' inputfile