web-dev-qa-db-fra.com

Transformer plusieurs lignes en une seule ligne, séparées par des virgules (Perl / Sed / AWK)

J'ai les données suivantes sur plusieurs lignes:

foo
bar
qux
zuu
sdf
sdfasdf

Ce que je veux faire est de les convertir avec une ligne et séparés par une virgule:

foo,bar,qux,zuu,sdf,sdfasdf

Quel est le meilleur unix one-liner pour le faire?

75
neversaint

Utilisation de la commande coller:

paste -d, -s file
128
Guru

fichier

aaa
bbb
ccc
ddd

xargs

cat file | xargs

résultat

aaa bbb ccc ddd 

xargs improoved

cat file | xargs | sed -e 's/ /,/g'

résultat

aaa,bbb,ccc,ddd 
63
Serhii Kuzmychov

xargs -a your_file | sed 's/ /,/g'

C'est un moyen plus court.

10
Serhii Kuzmychov

Cela peut être réalisé de plusieurs façons. L'outil que vous utilisez dépend principalement de vos préférences ou de votre expérience.

Utilisation de la commande tr:

tr '\n' ',' < somefile

Utilisation de awk:

awk -F'\n' '{if(NR == 1) {printf $0} else {printf ","$0}}' somefile
9
n3rV3

sur la base de votre exemple d’entrée, cette ligne awk fonctionne. (sans virgule)

awk -vRS="" -vOFS=',' '$1=$1' file

tester:

kent$  echo "foo
bar
qux
zuu
sdf
sdfasdf"|awk -vRS="" -vOFS=',' '$1=$1' 
foo,bar,qux,zuu,sdf,sdfasdf
7
Kent

Perl one-liner:

Perl -pe'chomp, s/$/,/ unless eof' file

ou, si vous voulez être plus crypté:

Perl '-peeof||chomp&&s/$/,/' file
6
choroba
Perl -pi.bak -e 'unless(eof){s/\n/,/g}' your_file

Cela créera une sauvegarde du fichier original avec une extension .bak, puis modifiera le fichier original.

1
Vijay
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'
1
protist