Réponses:
Vous trouverez ci-dessous une douzaine d'exemples sur la façon dont vous pouvez prendre un fichier tel que celui-ci:
$ cat k.txt
1
2
3
et convertissez-le dans ce format:
1,2,3
Vous pouvez utiliser cette commande pour créer le fichier ci-dessus si vous souhaitez jouer avec:
$ cat <<EOF > k.txt
1
2
3
EOF
Les exemples ci-dessous sont divisés en 2 groupes. Ceux qui "fonctionnent" et ceux qui "fonctionnent" presque. Je les laisse parce que souvent, il est tout aussi important de voir pourquoi quelque chose ne fonctionne pas, que de voir pourquoi quelque chose fonctionne.
La plupart des langages de script que je connais sont représentés. Certains sont représentés plusieurs fois, car comme avec le célèbre acronyme généralement référencé en Perl, TIMTOWTDI .
REMARQUE: vous pouvez échanger la virgule ( ,
) dans les exemples ci-dessous et la remplacer par les caractères que vous souhaitez, c'est-à-dire |
.
Ces extraits de code produiront la sortie souhaitée.
La paste
commande:
$ paste -s -d ',' k.txt
1,2,3
La sed
commande:
$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3
$ sed ':a;{N;s/\n/,/};ba' k.txt
1,2,3
La perl
commande:
$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3
$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3
La awk
commande:
$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3
$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3
La python
commande:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3
$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3
Intégré de Bash mapfile
:
$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3
La ruby
commande:
$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3
$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3
La php
commande:
$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3
Avertissements
La plupart des exemples ci-dessus fonctionneront très bien. Certains ont des problèmes cachés, comme l'exemple PHP ci-dessus. La fonction chop()
est en fait un alias rtrim()
, donc les espaces de fin de la dernière ligne seront également supprimés.
Il en va de même pour le premier exemple Ruby et le premier exemple Python. Le problème est de savoir comment ils utilisent tous un type d'opération qui "coupe" aveuglément un caractère de fin. C'est très bien dans l'exemple fourni par l'OP, mais il faut faire attention lors de l'utilisation de ces types de doublures pour s'assurer qu'elles sont conformes aux données qu'elles traitent.
Exemple
Disons que notre exemple de fichier k.txt
ressemble à ceci:
$ echo -en "1\n2\n3" > k.txt
Il ressemble mais a une légère différence. Il n'a pas de nouvelle ligne ( \n
) comme le fichier d'origine. Maintenant, lorsque nous exécutons le premier exemple Python, nous obtenons ceci:
$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,
Ce sont les exemples "toujours une demoiselle d'honneur, jamais une mariée" . La plupart d'entre eux pourraient probablement être adaptés, mais lorsque vous travaillez sur une solution potentielle à un problème, quand il se sent "forcé", ce n'est probablement pas le bon outil pour le travail!
La perl
commande:
$ perl -p -e 's/\n/,/' k.txt
1,2,3,
La tr
commande:
$ tr '\n' ',' < k.txt
1,2,3,
Les commandes cat
+ echo
:
$ echo $(cat k.txt)
1 2 3
La ruby
commande:
$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,
Bash's while
+ read
intégrés:
$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,
awk
je préfère une alternative plus courte:awk -vORS=, 1 k.txt
bash
:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
perl
abord awk
.
paste
celui en haut. C'est exactement paste -s
pour ça. C'est une commande standard et ce serait la plus efficace. Tous les autres sont exagérés et / ou ne sont pas portables ou ont des limitations.
mapfile
est relativement nouveau, ajouté en bash
4.0.
@slm a déjà donné une bonne réponse, mais comme votre question "format de sortie de xargs"
xargs -I{} echo -n "{}|" < test.txt
-I
est l'option "remplacer les chaînes".{}
est un espace réservé pour le texte de sortie.Si vous voulez vous débarrasser de la fuite, |
vous pouvez l'utiliser sed
pour nettoyer:
$ xargs -I{} echo -n "{}|" < k.txt | sed -e 's/|$//'
1|2|3
tr
, sed
et d'autres aussi ..
C'est un vieux fil, je sais. L'OP a demandé avec un code simple comme celui-ci. Pour le garder proche de l'original, j'ai une solution simple.
cat k.txt | xargs
1 2 3
utiliser sed
cat k.txt | xargs | sed 's/ /,/g'
1,2,3
ou
cat k.txt | xargs | sed 's/ /|/g'
1|2|3
sed peut sembler un peu bizarre mais en panne, cela a beaucoup de sens.
c'est pour remplacer. g 'est pour global: sans cela, il ne fera que la première substitution sur chaque nouvelle ligne. Puisque vous utilisez 'xargs', il les affiche sur une seule ligne. Vous obtiendrez donc "1,2 3".
Le délimiteur est utilisé pour la séparation. J'ai utilisé le caractère /. Une astuce intéressante: vous pouvez remplacer le délimiteur par la plupart des autres caractères, tant que nous conservons le même format entre les guillemets. Cela fonctionnerait donc aussi ...
cat k.txt | xargs | sed 's# #,#g'
ou
cat k.txt | xargs | sed 'sT T,Tg'
De toute évidence, l'utilisation de certains caractères comme délimiteur peut être source de confusion, alors soyez intelligent.
xargs <k.txt | tr \ \|
Vous n'avez pas besoin cat
- passez simplement l'entrée du fichier et - si aucune autre commande ne vous est donnée - xargs
passera son format par défaut - qui est du type avec /bin/echo
's (sans les interprétations de c-escape antislash) .
xargs
supprimera les espaces blancs tête / queue du fichier d'entrée et compressera les autres séquences d'espaces blancs en un seul espace. Cela signifie qu'en passant le fichier de tr
to xargs
like:
tr \\n \| <k.txt | xargs
... impressions ...
1|2|3|
... aller dans l'autre sens et fonctionner uniquement sur les arguments que l' xargs
espace-délimite fait ....
1|2|3\n
... car xargs
imprime le retour à la ligne final final (comme cela est requis pour un fichier texte) , mais il n'est pas tr
traité de cette façon.
Notez cependant que cela (ou toute autre solution proposée ici) ne tient pas compte des xargs
citations en entrée. xargs
passera littéralement des caractères d'espacement non-retour à la ligne simples / doubles / avec barre oblique inverse en entrée, qui peuvent eux-mêmes être cités comme:
xargs <<\IN
1 2' 3'\' \'4
IN
1 2 3' '4
xargs cat -n
, mais c'est plus facile si vous coupez simplement les caractères de nouvelle ligne, cela peut être réalisé avececho $(cat)
,grep
ouawk
(explorez la façon de le faire).xargs
ne correspondent pas bien à votre objectif actuel.