Existe-t-il un sort en ligne de commande permettant de supprimer une colonne dans un fichier CSV?


32

Avoir un fichier du contenu suivant:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

Je cherche à obtenir un fichier égal à l'original, mais il manque une nième colonne comme, pour n = 2 (ou peut-être 3)

1111,2222,4444
aaaa,bbbb,dddd

ou, pour n = 0 (ou peut-il être 1)

2222,3333,4444
bbbb,cccc,dddd

Un fichier réel peut prendre plusieurs gigaoctets et compter des dizaines de milliers de colonnes.

Comme toujours dans de tels cas, je pense que les magiciens en ligne de commande peuvent offrir une solution élégante ... :-)

Dans mon cas réel, j'ai besoin de supprimer 2 premières colonnes, ce qui peut être fait en supprimant une première colonne deux fois dans une séquence, mais je suppose qu'il serait plus intéressant de généraliser un peu.


Les champs sont-ils garantis pour ne pas contenir ,? (C'est-à-dire ,que l'on n'utilise jamais que des séparateurs de champs.)
un CVn

@ MichaelKjörling, ce serait bien d'avoir une solution plus flexible, mais dans mon cas - oui: le séparateur est ,et il ne se produit jamais dans un champ.
Ivan

Dans ce cas, la réponse de Scott devrait être la solution.
un CVn

Réponses:


47

Je pense que ceci est spécifique à couper des coreutils GNU:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

Normalement, vous spécifiez les champs souhaités via -f, mais en ajoutant - Complément, vous inversez naturellement le sens. De 'homme coupé':

--complement
    complement the set of selected bytes, characters or fields

Une mise en garde: si l’une des colonnes contient une virgule, elle sera coupée, parce que couper n’est pas un analyseur CSV de la même manière qu’un tableur. De nombreux analyseurs ont des idées différentes sur la façon de gérer les virgules dans CSV. Pour le cas simple d'un fichier CSV, en ligne de commande, couper est toujours le chemin à parcourir.


4
Cela fonctionne bien tant que c'est un simple fichier CSV. Si l’une des colonnes est une chaîne avec une virgule, elle cuts’envolera car ce n’est pas un analyseur CSV. Si un champ CSV a un séparateur de champ dans sa valeur, il est entouré de guillemets. Btw, au sujet de cut, -fprend des champs. cut -f, -d3-affichera le troisième champ en supprimant les deux premiers.
Alexios

2
Vous voulez direcut -d, -f3-
Inutile

@Alexios c'est un bon point. Je ne traite jamais vraiment avec de "vrais" CSV, seulement le sous-ensemble simple. Je vais modifier ma réponse pour refléter cela.
Scott McClung

@Useless: Zut, oui. C'est ce que j'appelle ma "dyslexie coupée" qui frappe à nouveau. soupir . Scott: Les fichiers CSV sont des bêtes difficiles. Beaucoup trop de sous-formats différents, dont certains ne sont même pas C SV, mais sont appelés conventionnellement de cette façon.
Alexios

Cela imprime le nouveau fichier CSV sur mon terminal - comment puis-je l’obtenir pour écraser l’entrée (ou peut-être écrire dans un nouveau fichier, semble-t-il que OP cherchait l’un ou l’autre)?
Max Ghenis

12

Si les données sont simplement constituées de colonnes séparées par des virgules:

cut -d , -f 1-2,4-

Vous pouvez aussi utiliser awk, mais c'est un peu gênant, car effacer un champ est facile, enlever le séparateur demande du travail. Si vous n'avez pas de champ vide, c'est pas trop grave:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

Si vous avez un fichier CSV réel, où des virgules peuvent apparaître à l'intérieur de champs s'il est correctement cité, vous avez besoin d'une vraie bibliothèque CSV .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.