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 de recherche et de remplacement standard dans Gedit ou LibreOffice, il est facile de remplacer la fin de ligne par un onglet. Mais si je permute simplement les retours chariot pour les onglets, j'obtiendrai ceci:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Mais ce que je dois faire, c'est que ça ressemble à 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 type d'itération conditionnelle peut être effectué 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 lorsque j'essaie d'ouvrir le tsv
fichier résultant 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:
la source
dos2unix
etunix2dos
.Vous pouvez utiliser
xargs
pour toujours regrouper quatre lignes en une, séparées par un seul espace chacune:-d '\n'
définit le délimiteur d'entrée sur un caractère de nouvelle ligne, sinon il se briserait également sur les espaces. Si vous n'avez de toute façon qu'un seul mot par ligne d'entrée, vous pouvez même l'omettre.-n4
définit le numéro d'argument (le nombre d'éléments d'entrée par ligne de sortie) sur 4.Production:
Ou si vous voulez des tabulations comme séparateurs au lieu d'un espace, vous pouvez les remplacer par la suite. Cependant, si vous aviez des espaces dans vos lignes d'entrée, ceux-ci seraient également remplacés:
Sortie (regardez en fonction de la largeur de l'onglet du navigateur / terminal):
la source
Vous pouvez également utiliser:
Les deux variables intégrées awk sont:
ORS
: O utput R ECORD S eparator (default = saut de ligne). Il est ajouté à la fin de chaque commande d'impression.NR
: N mbre de courant R oe awk traite.Cette commande affichera, pour chaque ligne, le contenu de la première (et ici uniquement) colonne. Ensuite, il choisit d'ajouter une nouvelle ligne ou un onglet en testant le reste de la division de
NR
par 4.la source
Une autre
awk
approche la plus courte :Ce printf la seule colonne suivie suivant et suivant et ... et un onglet
\t
caractère après chaque mais printf un\n
caractère ewline lorsque N mbre de R ECORD a été le facteur de 4 (oùNR%4
retournera 0 (false) qui est ce que l' opérateur ternairescondition(s)?when-true:when-false
fait.)la source
Ma solution serait d'utiliser la combinaison de
sed
etsed
. Tout d'abord, vous pouvez marquer chaque quatrième ligne avec un caractère spécial, par exemple>
, en utilisant cette solution:Dans ce cas, vous voulez commencer à partir de la ligne 5 et marquer toutes les 4 lignes après. Dans GNU,
sed
cela peut être donné comme une adresse5~4
. Vous pouvez utiliser cette commande:Ensuite, vous devez supprimer les sauts de ligne, ce qui peut être fait avec une
sed
boucle:Il existe des moyens plus simples de convertir les sauts de ligne en un autre caractère, par exemple avec
tr
:De toute façon, la combinaison des deux donne
(la
sed
version laisse une nouvelle ligne de fin, tandis que latr
version ne le fait pas)Après cela, il vous suffit de convertir les caractères spéciaux que vous avez insérés en retours à la ligne; voir par exemple Convertir un fichier délimité par des tabulations pour utiliser des retours à la ligne . Dans ce cas,
>
passez aux sauts de ligne:La
y
commande remplit la même fonction que latr
transformation d'un caractère en un autre, mais vous pouvez également utiliser las
commande ici. Avecs
, vous devezg
opérer sur chaque match de la ligne (sed 's/>/\n/g'
).Plutôt que de créer deux fichiers intermédiaires, vous pouvez utiliser des canaux:
Si les espaces de fin posent problème, vous pouvez ajouter une autre commande pour les supprimer:
la source
Par souci d'exhaustivité, voici une solution bash pure:
Fonctionne également avec les espaces, en supposant qu'il
IFS
est correctement défini (ce qu'il devrait par défaut, AFAIK). De plus, je pense que cela pourrait même être un script shell portable et fonctionner avec n'importe quel shell compatible POSIX.la source
$'
'
forme de citation n'est pas requise par POSIX. Par exemple, dansdash
(qui fournitsh
par défaut sur Ubuntu), exécuterprintf '%s\n' $'a\tb'
uniquement les sorties$a\tb
. Cela ne signifie pas que ce n'est pas utile cependant; cela fonctionne en bash. Cependant, comme pour certaines des autres solutions proposées par les utilisateurs, cela produit une sortie incomplète si le nombre de lignes d'entrée n'est pas un multiple de quatre. Aussi, je recommande d'utiliserread -r
, car il n'y a aucune raison de penser que l'expansion des échappements antislash dans le fichier d'entrée est souhaitée ici.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Une macro vim (enregistrée avec q) pourrait appliquer votre opération, puis sauter trois lignes. Ensuite, vous exécutez cette macro n fois.
par exemple:
la source
Puisque vous avez demandé une solution Gedit, quelque chose comme ça devrait fonctionner:
Trouver:
Remplacer par:
Assurez-vous que la case à cocher pour les expressions régulières est cochée.
Comment ça fonctionne:
La première étape consiste à rechercher une série de caractères de mot, avec \ w +, et à capturer les résultats dans la variable \ 1 en enveloppant les parenthèses autour de l'expression:
Ensuite, nous recherchons une série de caractères de fin de ligne, \ r et \ n, ou CR et LF. Étant donné que les fichiers au format Windows utilisent les deux, nous créons une classe de caractères en enveloppant ces deux caractères entre crochets. Le plus permet de rechercher un ou plusieurs caractères:
Enfin, nous répétons cela 3 fois de plus, en stockant chaque mot suivant dans les variables \ 2, \ 3 et \ 4. Cela rend notre remplacement par l'expression simple. Nous avons juste besoin de placer des caractères de tabulation, \ t, et un nouveau caractère de ligne, \ n, aux endroits appropriés pour la mise en forme dont vous avez besoin.
la source