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?
Utilisation de la commande coller:
paste -d, -s file
aaa
bbb
ccc
ddd
cat file | xargs
aaa bbb ccc ddd
cat file | xargs | sed -e 's/ /,/g'
aaa,bbb,ccc,ddd
xargs -a your_file | sed 's/ /,/g'
C'est un moyen plus court.
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
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
Perl one-liner:
Perl -pe'chomp, s/$/,/ unless eof' file
ou, si vous voulez être plus crypté:
Perl '-peeof||chomp&&s/$/,/' file
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.
sed -n 's/.*/&,/;H;$x;$s/,\n/,/g;$s/\n\(.*\)/\1/;$s/\(.*\),/\1/;$p'