188 votes

Comment fusionner deux lignes en une seule à partir de la ligne de commande ?

J'ai un fichier texte dont le format est le suivant. La première ligne est la "CLÉ" et la deuxième ligne est la "VALEUR".

KEY 4048:1736 string
3
KEY 0:1772 string
1
KEY 4192:1349 string
1
KEY 7329:2407 string
2
KEY 0:1774 string
1

J'ai besoin de la valeur sur la même ligne que la clé. La sortie devrait donc ressembler à ceci...

KEY 4048:1736 string 3
KEY 0:1772 string 1
KEY 4192:1349 string 1
KEY 7329:2407 string 2
KEY 0:1774 string 1

Ce serait mieux si je pouvais utiliser un délimiteur comme $ o , :

KEY 4048:1736 string , 3

Comment fusionner deux lignes en une seule ?

2 votes

Il existe de nombreuses façons de le faire ! J'ai fait un petit banc avec pr , paste , awk , xargs , sed et pure bash ! ( xargs est le plus lent, plus lent que bash !)

290voto

glenn jackman Points 69748

paste est bon pour ce travail :

paste -d " "  - - < filename

10 votes

Je pense que c'est la meilleure solution présentée, bien que n'utilisant ni sed ni awk. Sur une entrée qui est un nombre impair de lignes, la solution awk de Kent saute la dernière nouvelle ligne, sa solution sed saute la dernière ligne dans son intégralité, et ma solution répète la dernière ligne. paste par contre, se comporte parfaitement. +1.

8 votes

J'utilise souvent cut mais oublie toujours paste . Il est génial pour ce problème. J'avais besoin de combiner tous à partir de stdin et l'a fait facilement avec paste -sd ' ' - .

4 votes

Simple et beau !

216voto

Kent Points 71470

Awk :

awk 'NR%2{printf "%s ",$0;next;}1' yourFile

Notez qu'il y a une ligne vide à la fin de la sortie.

sed :

sed 'N;s/\n/ /' yourFile

0 votes

Ne fonctionne pas avec une sortie colorée. J'ai tout essayé sur ce Q&R et rien n'a fonctionné lorsque la sortie est colorée en ansi. Testé sur Ubuntu 13.04

1 votes

@elgalu : Parce que les couleurs ANSI sont juste un tas de combinaisons de caractères d'échappement. Faites un hexedit sur une telle sortie, pour voir ce que vous avez.

0 votes

Oui, je sais pourquoi ça ne marche pas, ce que je ne sais pas c'est comment le résoudre ;)

32voto

ghoti Points 14996

Il y a plus de façons de tuer un chien que la pendaison. [1]

awk '{key=$0; getline; print key ", " $0;}'

Mettez le délimiteur de votre choix entre les guillemets.


Références :

  1. A l'origine "Plenty of ways to skin the cat", retour à une expression plus ancienne, potentiellement originaire, qui n'a pas non plus de rapport avec les animaux de compagnie.

5 votes

En tant que propriétaire de chats, je n'apprécie pas ce genre d'humour.

4 votes

@witkacy26, expression ajustée selon votre préoccupation.

0 votes

J'adore cette solution awk mais je ne comprends pas comment elle fonctionne :S

17voto

Hai Vu Points 10359

Voici ma solution en bash :

while read line1; do read line2; echo "$line1, $line2"; done < data.txt

11voto

J.D. Points 83

Bien que les solutions précédentes semblent fonctionner, si une seule anomalie se produit dans le document, le résultat s'effondre. La solution ci-dessous est un peu plus sûre.

sed -n '/KEY/{
N
s/\n/ /p
}' somefile.txt

4 votes

Pourquoi est-ce plus sûr ? Que fait le /KEY/ faire ? Que fait le p faire à la fin ?

0 votes

Le site /KEY/ recherche la ligne avec le KEY . le p imprime le résultat. C'est plus sûr parce qu'il n'applique l'opération que sur les lignes avec un signe KEY en elle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X