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

25
demandé sur veilig 2011-10-21 20:03:09

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 
43
répondu ninjalj 2011-10-21 19:17:17

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 
7
répondu Kent 2011-10-21 21:15:42

Si se termine par 0 magasin, supprimer newline..

sed '/0$/!N;s/\n//'
2
répondu Karoly Horvath 2011-10-21 16:08:34

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}
'
2
répondu glenn jackman 2011-10-21 17:44:12

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 un p supplémentaire pour forcer l'impression finale et avec un z maintenant inutile (pour vider et réinitialiser l'espace de motif comme s/.*//)
2
répondu ekim 2017-05-23 12:10:25