une commande bash génère ceci:
Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active
Je voudrais le pousser à quelque chose pour le faire ressembler à ceci:
Runtime Name: vmhba2:C0:T1:L14 Group State: active
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]
c'est-à-dire supprimer chaque nouvelle ligne
J'ai essayé ... |tr "\nGroup" " "
mais cela a supprimé toutes les nouvelles lignes et a également mangé d'autres lettres. Merci
tr
est entièrement basé sur les caractères: vous avez demandé à tr de supprimer les nouvelles lignes et tous les 'G', 'r', 'o', 'u' et 'p'.Réponses:
Je ne peux pas tester maintenant, mais
devrait le faire
la source
paste -d ' ' - -
ajoutera un espace à la place si nécessaire)-
? Mercipaste
est utilisé pour concaténer les lignes correspondantes de fichiers:paste file1 file2 file3 ...
. Si l'un des arguments "fichier" est "-", les lignes sont lues à partir de l'entrée standard. S'il y a 2 "-" arguments, alors coller prend 2 lignes de stdin. Etc. Voir la page de manuel .Une possibilité est:
Si le numéro de ligne est divisible par 2, terminez par une nouvelle ligne, sinon, terminez par un espace.
(Testé sur: CentOS 6, GNU Awk 3.1.7)
Utilisation de sed (voir explication ):
Lectures complémentaires:
la source
Si vous voulez utiliser
sed
, il n'y a aucune raison de lire le fichier entier en mémoire. Vous pouvez fusionner chaque ligne comme ceci:Utilisez n'importe quel caractère que vous voudriez au lieu de l'espace.
Voici un autre moyen d'utiliser awk:
Le
if/else
gère le cas où il y a un nombre impair de lignes dans le fichier. Sans cela, la dernière ligne impaire est imprimée deux fois. Sinon, à titre de comparaison, vous pourriez faire:la source
awk '{printf "%s", $0; $0=""; getline; print " " $0}'
La manière la plus idiomatique de le faire
awk
est la suivante:Il produit:
Pour l'expliquer, nous devons définir chacune des variables intégrées:
RS
séparateur d'enregistrement. La valeur par défaut est\n
(nouvelle ligne).ORS
séparateur d'enregistrement de sortie. La valeur par défaut est\n
(nouvelle ligne).FS
séparateur de champ. La valeur par défaut est(espace).
NR
numéro d'enregistrement.Comme le séparateur d'enregistrement par défaut est la nouvelle ligne, un enregistrement est, par défaut, une ligne.
NR%2
est le module deNR/2
, de sorte qu'il soit0
ou1
.0
pour les lignes paires et1
pour les lignes impaires.var=condition?condition_if_true:condition_if_false
est l'opérateur ternaire.Tous ensemble, en disant que
ORS=NR%2?FS:RS
nous définissons le séparateur d'enregistrement de sortie:2k + 1
, c'est-à-dire sur des lignes paires, les séparateurs d'enregistrement en sortie sont définis surFS
, c'est-à-dire un espace.2k
, c'est-à-dire sur les lignes impaires, les séparateurs d'enregistrement en sortie sont définis surRS
, c'est-à-dire une nouvelle ligne.De cette façon, les lignes impaires se terminent par un espace, qui est ensuite joint à la ligne suivante. Après cette ligne, une nouvelle ligne est imprimée.
Plus d'infos dans awk idiomatique .
la source
Cela fonctionne pour moi sur Linux:
Ceci remplace un espace vide pour un caractère de nouvelle ligne; vous devez échapper au caractère de nouvelle ligne pour que les choses fonctionnent correctement.
la source
En bash:
la source
Si Perl est une option:
perl -pe 's/\n/ / if $. % 2 == 1' file
s/\n/ /
remplace newline par un espace$.
est le numéro de la lignela source
Que diriez-vous d'utiliser
grep
?la source