sed joindre lignes ensemble
Quelle serait la commande sed (ou autre outil) pour joindre des lignes dans un fichier qui ne se termine pas avec le caractère '0'?
J'aurai des lignes comme ceci
412|n|Leader de Matériaux de Construction||||||||||d|d|20||0
Qui doivent être laissés seuls, et alors j'aurai des lignes comme celle-ci par exemple (qui est de 3 lignes, mais une seule se termine w/ 0)
107 / N / nouage outils / / / / / nouage Outils
|||||d|d|0||0
Qui doivent être joint/combiné en une seule ligne
107|n|Nouage Outils|||||Nouage Outils|||||d|d|0||0
5 réponses
sed ':a;/0$/{N;s/\n//;ba}'
Dans une boucle (branche ba
pour étiqueter :a
), si la ligne actuelle se termine par 0 (/0$/
) ajouter la ligne suivante (N
) et supprimer la nouvelle ligne interne (s/\n//
).
Awk:
awk '{while(/0$/) { getline a; $0=$0 a; sub(/\n/,_) }; print}'
Perl:
perl -pe '$_.=<>,s/\n// while /0$/'
Bash:
while read line; do
if [ ${line: -1:1} != "0" ] ; then
echo $line
else echo -n $line
fi
done
Awk pourrait être court aussi:
awk '!/0$/{printf $0}/0$/'
Test:
kent$ cat t
#aasdfasdf
#asbbb0
#asf
#asdf0
#xxxxxx
#bar
kent$ awk '!/0$/{printf $0}/0$/' t
#aasdfasdf#asbbb0
#asf#asdf0
#xxxxxx#bar
Si se termine par 0 magasin, supprimer newline..
sed '/0$/!N;s/\n//'
Un one-liner Perl typiquement cryptique:
perl -pe 'BEGIN{$/="0\n"}s/\n//g;$_.=$/'
Cela utilise la séquence "0\N" comme séparateur d'enregistrement (par votre question, je suppose que chaque ligne devrait se terminer par un zéro). Tout enregistrement ne devrait alors pas avoir de retours à la ligne internes, donc ceux-ci sont supprimés, puis imprimez la ligne, en ajoutant le 0 et le retour à la ligne qui ont été supprimés.
Une autre réponse à votre question serait de s'assurer que chaque ligne a 17 champs séparés par des tuyaux. Cela ne suppose pas que la valeur du 17ème champ doit être zéro.
awk -F \| '
NF == 17 {print; next}
prev {print prev $0; prev = ""}
{prev = $0}
'
La note de cette réponse {[22] } est surprenante ;s
(ce jeu de mots d'émoticônes surpris sur la substitution sed est intentionnel) compte tenu des spécifications OP: sed join lines together .
Ce présentation de, dernier commentaire
"si c'est le cas, vérifiez ce que @ ninjalj a soumis"
Suggère Également de vérifier la même réponse.
Ie. Vérifier en utilisant sed ':a;/0$/{N;s/\n//;ba}'
verbatim
sed ':a;/0$/{N;s/\n//;ba}'
does
no one
ie. 0
people,
try
nothing,
ie. 0
things,
any more,
ie. 0
tests?
(^D aka eot 004 ctrl-D ␄ ... bash generate via: echo ^V^D)
Qui ne donnera pas (faire le test ;):
does no one ie. 0
people, try nothing, ie. 0
things, any more, ie. 0
tests? (^D aka eot 004 ctrl-D ␄ ... bash generate via: echo ^V^D)
Pour obtenir cette utilisation:
sed 'H;${z;x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
Ou:
sed ':a;/0$/!{N;s/\n//;ba}'
Pas:
sed ':a;/0$/{N;s/\n//;ba}'
Notes:
sed 'H;${x;s/\n//g;p;};/0$/!d;z;x;s/\n//g;'
N'utilise pas de ramification et
est identique à:
sed '${H;z;x;s/\n//g;p;};/0$/!{H;d;};/0$/{H;z;x;s/\n//g;}'
-
H
commence, toutes les séquences -
d
court-circuite l'exécution de la commande de script sur la ligne en cours et démarre le cycle suivant donc les sélecteurs d'adresse suivants/0$/!
ne peuvent être que/0$/!!
donc le sélecteur d'adresse de/0$/{H;z;x;s/\n//g;}
est redondant et non nécessaire. - si une ligne ne se termine pas par 0 enregistrer en soute espace
/0$/!{H;d;}
- Si une ligne se termine par 0, enregistrez-la aussi, puis imprimez flush (double sens ie. purgé et lignes alignées)
/0$/{H;z;x;s/\n//g;}
- NB
${H;z;x;s/\n//g;p;}
utilise les commandes/0$/ ...
avec unp
supplémentaire pour forcer l'impression finale et avec unz
maintenant inutile (pour vider et réinitialiser l'espace de motif comme s/.*//)