GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Est-il possible avec Gedit ou la ligne de commande de modifier chaque quatrième ligne d'un fichier texte ?

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 :

  1. 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 ?
Ubuntu
  1. Soyez trié avec sort en ligne de commande

  2. Copiez et collez sur la ligne de commande Linux avec xclip

  3. Manipulation de texte en ligne de commande avec sed

  4. Multi-tâches en ligne de commande avec screenie

  5. exécuter une commande sur chaque ligne d'un fichier texte

Comment télécharger un fichier sur Ubuntu à l'aide de la ligne de commande

Manipuler du texte en ligne de commande avec grep

Suivi du temps avec Timewarrior en ligne de commande

Comment télécharger un fichier sur Ubuntu Linux à l'aide de la ligne de commande

Afficher le contenu d'un fichier dans la ligne de commande Linux

La commande Cat n'affiche pas les lignes du texte ?