utiliser awk pour imprimer une colonne, en ajoutant une virgule
J'ai un fichier, à partir de laquelle je veux récupérer la première colonne, et ajouter une virgule entre chaque valeur.
Exemple:
AAAA 12345 xccvbn
BBBB 43431 fkodks
CCCC 51234 plafad
pour obtenir
AAAA,BBBB,CCCC
J'ai décidé d'utiliser awk, donc je n'ai
awk '{ $1=$1","; print $1 }'
Problème est: cela s'ajoute une virgule également sur la dernière valeur, qui n'est pas ce que je veux atteindre, et aussi je reçois un espace entre les valeurs.
Comment puis-je supprimer la virgule sur le dernier élément, et comment puis-je supprimer l'espace? Passé 20 minutes à regarder le manuel, mais sans succès.
cela peut être utile: stackoverflow.com/questions/8714355/...
Brillant, sur place!
Pas de. L'ajout d'une virgule avec awk et puis la tuyauterie à sed pour supprimer la virgule est ridicule approche. Il suffit de ne pas ajouter la virgule.
Double Possible de Bash tournant multi-ligne de chaîne de caractères en un seul séparées par des virgules
Brillant, sur place!
Pas de. L'ajout d'une virgule avec awk et puis la tuyauterie à sed pour supprimer la virgule est ridicule approche. Il suffit de ne pas ajouter la virgule.
Double Possible de Bash tournant multi-ligne de chaîne de caractères en un seul séparées par des virgules
OriginalL'auteur | 2014-06-10
Vous devez vous connecter pour publier un commentaire.
ou si vous préférez:
ou si vous aimez le golf et ne me dérange pas qu'il soit inefficace pour les gros fichiers:
sep
après la premièreprintf
fait-il pas apparaître en premier temps.Certains de golf
awk '{printf (NR>1?",":"")"%s",$1} END{print ""}'
Si vous voulez jouer au golf alors
awk '{a=a s$1;s=","} END{print a}'
mais à mon humble avis son moins clair, et il est moins efficace pour les gros fichiers.OriginalL'auteur Ed Morton
Pourquoi faire compliqué 🙂 (tant que le fichier n'est pas trop grand)
Pour mieux porability.
$1
deux fois, et non entre parenthèses opérateur ternaire peut échouer dans certains awks.D'accord, mais les OP ne dit rien sur la taille du fichier.
Droit, d'où l'expression "c'est probablement d'amende". FWIW
'{a=a (NR>1?",":"") $1} END {print a}'
permettrait de résoudre la redondance et des problèmes de portabilité.Je n'ai vu que je pouvais prendre
$1
forme sur le test, mais là, j'avais besoin de parenthèses (qui devrait être utilisé de toute façon) et le besoin d'ajouter""
en fait plus.OriginalL'auteur Jotne
Il dit: Si c'est la première ligne d'impression de premier champ, pour les autres lignes de la première impression
,
puis imprimez premier champ.De sortie:
awk '{printf "%s",(NR==1?$1:","$1)}END{print ""}' file
pourrait être plus approprié.Ce n'ajoute pas de nouvelle ligne à la fin. Je ne vois pas l'OP dit rien à ce sujet.
OriginalL'auteur Ashkan
Dans ce cas, en tant que simple couper-coller solution
OriginalL'auteur kvantour
Vous pouvez faire ceci:
a++ est interprétée comme une condition. Dans la première ligne, sa valeur est 0, donc la virgule n'est pas ajouté.
EDIT:
Si vous souhaitez un retour à la ligne, vous devez ajouter
END{printf "\n"}
. Si vous avez des problèmes de lecture dans le fichier, vous pouvez également essayer:a
etNR
. L'ajout d'un saut de ligne estprint ""
. Pourquoi voudriez-vous avez des problèmes de lecture d'un fichier?Je ne comprends pas ce que tu veux dire avec ta première phrase? Mais il serait peut-être plus élégant à l'aide de NR en tant que condition. Et merci pour les retour à la ligne - astuce.
À droite, c'est juste que vous n'avez pas besoin d'une variable distincte de compter le nombre record depuis
NR
est déjà prévu.Alright. J'ai pensé à l' ++[$0] idiome pour unifier et peu utilisé...
OriginalL'auteur Nils-o-mat
Dans le cas où quelqu'un comme moi qui veut l'utiliser awk pour le nettoyage des images docker:
OriginalL'auteur Oleg Neumyvakin
À L'Aide De Perl
OriginalL'auteur stack0114106