2012-04-24 5 views
3

J'ai une fonction dans bash qui génère un tas de lignes sur stdout. Je veux les combiner en une seule ligne avec un délimiteur entre eux.comment concaténer des lignes en une chaîne

Avant:

one 
two 
three 

Après:

one:two:three 

Qu'est-ce qu'un moyen facile de le faire?

Répondre

8

Utilisation paste

$ echo -e 'one\ntwo\nthree' | paste -s -d':' 
one:two:three 
+0

c'est la bonne réponse. Je le savais, il y avait une fonction simple qui faisait exactement ça. – Shep

1

Prendre @ corrections de glennJackman verbatim

awk '{printf("%s%s", sep, $0); sep=":"} END {print ""}' file 

Ou que vous avez spécifié bash

while read line ; do printf "%s:" $line ; done < file | sed s'/:$//' 

J'espère que cette aide

+0

Intéressant point ... sont 'awk' /' paste'/'grep' etc ne sont pas considérés comme faisant partie de bash? – Shep

+0

tout dépend de votre point de vue. bash est un shell. awk/paste/grep etc fonctionnent à l'intérieur de n'importe quel shell basé sur Unix: ash, bash, tiret, ksh, rc, sh, zsh, et.al ;-) – shellter

+0

Ces solutions émettent un deux-points.Pour l'éviter, vous pouvez rediriger vers sed pour le supprimer, ou faire quelque chose comme: 'awk '{printf ("% s% s ", sep, $ 0); sep = ":"} END {print ""} '' –

2

Cela pourrait fonctionner pour vous:

paste -sd':' file 
1

Pour le plaisir, voici une façon bash seule:

echo $'one\n2 and 3\nfour' | { mapfile -t lines; IFS=:; echo "${lines[*]}"; } 

sorties

one:2 and 3:four 

Le regroupement {} est d'assurer toutes les commandes qui se réfèrent à la variable tableau sont exécutées dans le même sous-shell. La variable n'existera pas une fois le pipeline terminé.

http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile-140

0

Entree.txt

one 
two 
three 

Perl Solution: dummy.pl

@a = `cat /home/Input.txt`; 
    foreach my $x (@a) 
    { 
      chomp($x); 
      push(@array,"$x"); 
    } 
    chomp(@array); 
    print "@array"; 

Exécuter le script:

$> perl dummy.pl | sed 's//:/g'> Output.txt

Output.txt

un: deux: trois

2

Et une autre façon:

cat file | tr -s "\n" ":" 
Questions connexes