AWK – affiche la plage de colonnes

si jai un fichier csv au format suivant:

column1,column2,column3,column4,column5,column6,column7,column8 

et je veux que awk nimprime que les colonnes 2 à 7 que jutiliserais:

awk -F"," "{print $2 "," $3 "," $4 "," $5 "," $6 "," $7}" file.csv 

et get:

column2,column3,column4,column5,column6,column7 

existe-t-il un moyen de concaténer les colonnes 2 à 7 pour simplifier la commande. Comme je pense à un fichier avec un peu plus de colonnes, ma commande awk deviendrait horriblement longue.

Commentaires

  • allez-vous toujours vouloir un ensemble consécutif de colonnes (par exemple 2-7, ou 5-15 ou autre)? si oui, vous pouvez utiliser une boucle pour imprimer les colonnes. Sinon, là ' ne vous évitez pas de lister les colonnes individuelles que vous voulez (bien que vous puissiez mélanger dans quelques boucles si nécessaire). Aussi, combien de colonnes?
  • Enfin, vous voudrez pour considérer un langage comme perl ou python avec un bon analyseur CSV …. surtout si vous avez les noms de colonnes dans la première ligne (plusieurs modules danalyse CSV de perl ' peuvent utiliser ceux-ci pour construire un hachage avec les noms de colonnes comme clés. i ' m assez sûr python ' s les analyseurs CSV peuvent faire la même chose). perl a également dexcellents opérateurs dépissage de hachage de tableau &.
  • @cas oui les colonnes seraient alwa ys consécutifs.
  • Cela répond-il à votre question? Imprimer la plage de colonnes séparées par des virgules et le reste sans séparation par des virgules

Réponse

$ awk -v b=2 -v e=7 "BEGIN{FS=OFS=","} {for (i=b;i<=e;i++) printf "%s%s", $i, (i<e ? OFS : ORS)}" file column2,column3,column4,column5,column6,column7 

b = numéro de champ de début, e = numéro de champ de fin. Si vous devez gérer les CSV avec des champs entre guillemets, des virgules incorporées, des sauts de ligne, etc., consultez https://stackoverflow.com/q/45420535/1745001 .

Réponse

La coupe utilitaire a une notation compacte:

cut -d, -f2-7 <input-file> 

produisant:

colonne2, colonne3, colonne4, colonne5, colonne6, colonne7

En réponse au commentaire de @PlasmaBinturong: mon intention était de résoudre le problème dune courte séquence dappel: " … ma commande awk deviendrait horriblement longue … ". Cependant, on peut également trouver des codes qui arrangent les champs comme on le souhaite. Autant que jaime awk, perl, python, jai souvent trouvé utile de créer un utilitaire spécifique pour étendre les capacités du standard * nix. Voici donc un extrait dun script de test, s2, montrant des utilitaires recouper et organiser, tous deux permettent le réarrangement et la duplication, avec arrangement permettant également de réduire les plages de champs:

FILE=${1-data1} # Utility functions: print-as-echo, print-line-with-visual-space. pe() { for _i;do printf "%s" "$_i";done; printf "\n"; } pl() { pe;pe "-----" ;pe "$*"; } pl " Input data file $FILE:" head $FILE pl " Results, cut:" cut -d, -f2-7 $FILE pl " Results, recut (modified as my-recut):" my-recut -d "," 7,6,2-5 < $FILE pl " Results, arrange:" arrange -s "," -f 5,3-1,7,5,3-4,5 $FILE 

produisant des résultats à partir de ces versions:

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64 Distribution : Debian 8.11 (jessie) bash GNU bash 4.3.30 cut (GNU coreutils) 8.23 recut - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 ) arrange (local) 1.15 ----- Input data file data1: column1,column2,column3,column4,column5,column6,column7,column8 ----- Results, cut: column2,column3,column4,column5,column6,column7 ----- Results, recut (modified as my-recut): column7,column6,column2,column3,column4,column5 ----- Results, arrange: column5,column3,column2,column1,column7,column5,column3,column4,column5 

Le my-recut est une légère modification de la recoupe du code textutils, et arrange est notre version dune coupe étendue . Plus dinformations:

recut Process fields like cut, allow repetitions and re-ordering. (what) Path : ~/bin/recut Version : - ( local: RepRev 1.1, ~/bin/recut, 2010-06-10 ) Length : 56 lines Type : Perl script, ASCII text executable Shebang : #!/usr/bin/perl Home : http://www1.cuni.cz/~obo/textutils/ (doc) Modules : (for perl codes) Getopt::Long 2.42 arrange Arrange fields, like cut, but in user-specified order. (what) Path : ~/bin/arrange Version : 1.15 Length : 355 lines Type : Perl script, ASCII text executable Shebang : #!/usr/bin/perl Modules : (for perl codes) warnings 1.23 strict 1.08 Carp 1.3301 Getopt::Euclid 0.4.5 

Meilleurs voeux … bravo, drl

Commentaires

  • Contrairement à Awk, il affiche les colonnes dans lordre du fichier dentrée, pas dans lordre de la commande.
  • @PlasmaBinturong – voir la réponse modifiée … acclamations

Réponse

sed -e " s/,/\n/7 ;# tag the end of col7 s/^/,/ ;# add a comma s/,/\n/2 ;# tag beginning of col2 s/.*\n\(.*\)\n.*/\1/ ;# perform surgery " file.csv 

Résultats:

column2,column3,column4,column5,column6,column7 

Réponse

Testé avec la commande ci-dessous et cela a bien fonctionné

awk -F "," "OFS=","{$1="";$NF="";print $0}" o| sed "s/^,//g"|sed "s/,$//g" 

sortie

column2,column3,column4,column5,column6,column7 

Commentaires

  • merci pour la réponse, fonctionne très bien sans " o " avant le premier sed pipe 🙂 on pourrait concaténer les deux commandes sed en une seule: sed "s/^,//g; s/,$//g"
  • Pourquoi testez-vous le résultat de lexécution de

pour décider dimprimer ou non la ligne? Il y a aussi dautres problèmes (par exemple, vous navez PAS besoin de tubes pour les commandes sed lorsque vous ' utilisez awk!) Mais cette partie de test OFS na absolument aucun sens …

  • @EdMorton Je ' espère toujours une awk sollution …
  • @nath pourquoi ? Quel est le problème de ' avec la cut solution que @drl a publiée ?
  • @EdMorton non vous avez raison, ça marche bien. Je pensais que ça ne pouvait pas être trop compliqué avec awk et jétais plutôt curieux pour la question qui nous intéresse alors pour une raison technique 🙂
  • Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *