J'essaie de convertir un fichier texte en une feuille de calcul séparée par des tabulations. Mon fichier texte ressemble à ceci :
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Avec les fonctions standard de recherche et de remplacement dans Gedit ou LibreOffice, il est facile de remplacer la fin de ligne par une tabulation. Mais si je remplace simplement les retours chariot par des tabulations, j'obtiendrai ceci :
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Mais ce que je dois faire, c'est le faire ressembler à ceci :
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Alors, puis-je échanger chaque caractère de fin de ligne pour un onglet sauf pour chaque quatrième ligne ?
Je ne sais pas si ce genre d'itération conditionnelle peut être fait avec des expressions régulières dans un programme comme Gedit ou LibreOffice, alors peut-être que cela doit être une sorte de fonction de ligne de commande ? Je ne sais même pas quel est le meilleur outil pour commencer.
Mise à jour :
J'ai essayé les commandes suivantes :
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Mais quand j'essaie d'ouvrir le résultat tsv
fichier dans LibreOffice, les colonnes ne sont pas tout à fait correctes. Je ne sais pas si cela signifie que je n'exécute pas correctement les commandes ci-dessus ou si je fais quelque chose de mal dans la fonction d'importation de LibreOffice :
Juste pour référence, le résultat souhaité devrait ressembler à ceci :
Réponse acceptée :
Vous pourriez utiliser un éditeur de ligne de commande tel que sed
sed 'N;N;N;s/\n/\t/g' file > file.tsv
ou, plus par programmation, en ajoutant une barre oblique inverse caractères de continuation de ligne à chacune des lignes que vous voulez joindre en utilisant le n skip m
de GNU sed opérateur d'adresse et le suivre avec le one-liner classique pour rejoindre les lignes continues :
sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'
Voir par exemple Sed One-Liners Explained :
Ajouter une ligne à la suivante si elle se termine par une barre oblique inverse "\".
sed -e :a -e '/\\$/N; s/\\\n//; ta'
Cependant, à mon humble avis, ce serait plus facile avec l'un des autres utilitaires de traitement de texte standard, par exemple
paste - - - - < file > file.tsv
(le nombre de -
correspondra au nombre de colonnes) ou
pr -aT -s$'\t' -4 file > file.tsv
(vous pouvez omettre le -s$'\t
si cela ne vous dérange pas que la sortie soit séparée par plusieurs onglets).
Le comportement étrange de réimportation que vous observez est presque certainement dû au fait que le fichier d'origine a des fins de ligne CRLF de style Windows. Si vous devez travailler avec des fichiers à partir de Windows, vous pouvez intégrer la conversion dans la commande de différentes manières, par exemple
tr -d '\r' < file.csv | paste - - - -
ou
sed 'N;N;N;s/\r\n/\t/g' file.csv
Le premier supprimera TOUS les retours chariot tandis que le second conservera un CR à la fin de chacune des nouvelles lignes (ce qui peut être ce que vous voulez si l'utilisateur final prévu est sous Windows).
En relation:Tablette graphique Wacom Cth-480 / Ctl-480 non détectée dans Ubuntu 13.10 dans Ubuntu ?