Joindre une ligne basée sur un délimiteur utilisant awk, sed dans unix

Je voudrais joindre des lignes qui se terminent par un | avec la ligne suivante.

Exemple:

 abcd| ef 123456| 78| 90 

Sortie désirée:

 abcdef 1234567890 

Cela pourrait fonctionner pour vous (GNU sed):

 sed ':a;N;s/|\s*\n//;ta;P;D' file 

Avec GNU sed:

 $ sed ':a;/| *$/{N;ba};s/| *\n//g' infile abcdef 1234567890 

Cela fait ce qui suit:

 :a # Label to branch to /| *$/{ # If the line ends with a pipe and optional spaces N # Append next line to pattern space ba # Branch to label } s/| *\n//g # Remove all pipes followed by optional spaces and a newline 

Pour que cela fonctionne sous BSD sed, la commande doit être divisée après les étiquettes et les commandes de twigment:

 sed -e ':a' -e '/| *$/{N;ba' -e '};s/| *\n//g' infile 

Avec GNU awk pour RS multi-char:

 $ awk -v RS='[|]\\s*\\n' -v ORS= '1' file abcdef 1234567890 

Avec d’autres astuces, un moyen serait:

 $ awk 'sub(/\|[[:blank:]]*$/,"") {s = s $0; next} {print s $0; s=""}' file abcdef 1234567890 

Si votre dernière ligne de saisie peut se terminer par | vous devez nous dire comment gérer cela et append des exemples d’entrées / sorties, y compris ce cas, à votre question.

Vous pouvez essayer ce sed ,

 sed ':loop; /| *$/{N;s/\n//g}; t loop' yourfile | sed 's/ *| *//g' 

awk à la rescousse! Le script suivant supprime les caractères de canal et les nouvelles lignes lorsqu’ils se produisent.

 $ awk '{c=sub(/\|/,"")?"":"\n"; $1=$1; printf "%s%s",$0,c}' file abcdef 1234567890 

J’ai commencé avec ça

 awk -F '|' 'NF>1 {printf "%s", $1} NF==1' file 

Mais alors j’ai pensé que cela faisait trop d’hypothèses sur le nombre de champs que vous pourriez avoir. J’ai donc fini avec

 awk -F '|' '{if (NF>1 && $NF ~ /^[[:blank:]]*$/) {NF--; printf "%s", $0} else print}' file 

ce qui est beaucoup plus robuste mais moins laconique.

Considérant que le texte saisi est stocké dans un nom de fichier infile

Vous pouvez utiliser cette commande GNU sed: sed ':begin;$!N;s/\n//;s/\s//g;s/|//g' infile

 awk '{sub(/\|/,"")}{printf "%s",$1}/f/{print "\r"}END {print ""}' file abcdef 1234567890