Si j'ai un fichier csv, existe-t-il un moyen rapide d'imprimer le contenu d'une seule colonne? Il est sûr de supposer que chaque ligne a le même nombre de colonnes, mais le contenu de chaque colonne aurait une longueur différente.
111
echo '1,"2,3,4,5",6' | awk -F "\"*,\"*" '{print $2}'
imprimera à la2
place de2,3,4,5
.gawk -F"|" "{print $13}" files*.csv
...,"string,string",...
"
et la dernière se terminera par"
awk -F "\"*;\"*" '{print $2}' textfile.csv
Oui.
cat mycsv.csv | cut -d ',' -f3
imprimera la 3e colonne.la source
awk
Le moyen le plus simple pour y parvenir était d'utiliser simplement csvtool . J'ai également eu d'autres cas d'utilisation pour utiliser csvtool et il peut gérer les guillemets ou les délimiteurs de manière appropriée s'ils apparaissent dans les données de la colonne elle-même.
Le remplacement de 2 par le numéro de colonne extraira efficacement les données de colonne que vous recherchez.
la source
cat input.csv | csvtool formath '%(2)\n' -
.format '%(2)\n'
commande ne peut pas dire où se termine un champ. (csvtool 1.4.2)csvtool
semblent nécessiter l'utilisation-
comme nom de fichier d'entrée pour lire depuis stdin.csvtool format '%(1),%(10)\n' - < in.csv > out.csv
Atterri ici à la recherche d'extraits d'un fichier séparé par des tabulations. Je pensais que j'ajouterais.
Où
-f2
extrait la colonne indexée 2 non nulle ou la deuxième colonne.la source
cat
c'est inutile:< textfile.tsv cut -f2 -s
De nombreuses réponses à ces questions sont excellentes et certaines ont même examiné les cas secondaires. Je voudrais ajouter une réponse simple qui peut être d'un usage quotidien ... où vous entrez principalement dans ces cas d'angle (comme avoir échappé des virgules ou des virgules entre guillemets, etc.).
Donc, en utilisant BEGIN (Exécuter avant de prendre une entrée), nous pouvons définir ce champ sur tout ce que nous voulons ...
Le code ci-dessus imprimera la 3ème colonne dans un fichier csv.
la source
Les autres réponses fonctionnent bien, mais comme vous avez demandé une solution en utilisant uniquement le shell bash, vous pouvez le faire:
Et puis vous pouvez extraire des colonnes (la première dans cet exemple) comme ceci:
Il se passe donc deux ou trois choses ici:
while IFS=,
- cela veut dire utiliser une virgule comme IFS (Internal Field Separator), qui est ce que le shell utilise pour savoir ce qui sépare les champs (blocs de texte). Donc dire IFS =, c'est comme dire "a, b" est la même chose que "a b" le serait si IFS = "" (ce qui est ce que c'est par défaut).read -a csv_line;
- cela signifie lire dans chaque ligne, une à la fois et créer un tableau où chaque élément est appelé "csv_line" et l'envoyer à la section "do" de notre boucle whiledo echo "${csv_line[0]}";done < file
- maintenant nous sommes dans la phase "faire", et nous disons echo le 0e élément du tableau "csv_line". Cette action est répétée sur chaque ligne du fichier. La< file
partie indique simplement à la boucle while où lire. REMARQUE: rappelez-vous que dans bash, les tableaux sont indexés à 0, donc la première colonne est le 0e élément.Donc là vous l'avez, extraire une colonne d'un CSV dans le shell. Les autres solutions sont probablement plus pratiques, mais celle-ci est pure bash.
la source
Vous pouvez utiliser GNU Awk, voir cet article du guide de l'utilisateur . Pour améliorer la solution présentée dans l'article (en juin 2015), la commande gawk suivante autorise les guillemets à l'intérieur des champs entre guillemets doubles; un guillemet double y est marqué par deux guillemets doubles consécutifs (""). De plus, cela autorise les champs vides, mais même cela ne peut pas gérer les champs multilignes . L'exemple suivant imprime la 3e colonne (via
c=3
) de textfile.csv:Notez l'utilisation de
dos2unix
pour convertir les sauts de ligne de style DOS possibles (CRLF c'est-à-dire "\ r \ n") et le codage UTF-16 (avec marque d'ordre d'octet) en "\ n" et UTF-8 (sans marque d'ordre d'octet), respectivement. Les fichiers CSV standard utilisent CRLF comme saut de ligne, voir Wikipedia .Si l'entrée peut contenir des champs multilignes, vous pouvez utiliser le script suivant. Notez l'utilisation d'une chaîne spéciale pour séparer les enregistrements en sortie (car le saut de ligne par défaut du séparateur peut se produire dans un enregistrement). Encore une fois, l'exemple suivant imprime la 3e colonne (via
c=3
) de textfile.csv:Il existe une autre approche du problème. csvquote peut afficher le contenu d'un fichier CSV modifié de sorte que les caractères spéciaux dans le champ soient transformés afin que les outils de traitement de texte Unix habituels puissent être utilisés pour sélectionner certaines colonnes. Par exemple, le code suivant génère la troisième colonne:
csvquote
peut être utilisé pour traiter des fichiers volumineux arbitraires.la source
Voici un exemple de fichier csv avec 2 colonnes
Pour obtenir la première colonne, utilisez:
f représente le champ et d le délimiteur
L'exécution de la commande ci-dessus produira la sortie suivante.
Production
Pour obtenir la 2ème colonne uniquement:
Et voici la sortie Output
Un autre cas d'utilisation:
Votre fichier d'entrée csv contient 10 colonnes et vous voulez les colonnes 2 à 5 et les colonnes 8, en utilisant la virgule comme séparateur ".
cut utilise -f (signifiant «champs») pour spécifier les colonnes et -d (signifiant «délimiteur») pour spécifier le séparateur. Vous devez spécifier ce dernier car certains fichiers peuvent utiliser des espaces, des tabulations ou des deux-points pour séparer les colonnes.
cut est un utilitaire de commande et voici quelques exemples supplémentaires:
la source
J'avais besoin d'une analyse CSV appropriée, pas de
cut
/awk
et de prière. J'essaye ceci sur un mac sanscsvtool
, mais les macs sont livrés avec ruby, donc vous pouvez faire:la source
Nous allons d'abord créer un CSV de base
Ensuite, nous obtenons la 1ère colonne
la source
où 2 est la colonne qui vous intéresse
tu peux aussi faire
faire plusieurs colonnes
la source
Je pense que le plus simple est d'utiliser csvkit :
Obtient la 2ème colonne:
csvcut -c 2 file.csv
Cependant, il existe aussi csvtool , et probablement un certain nombre d'autres outils csv bash:
sudo apt-get install csvtool
(pour les systèmes basés sur Debian)Cela renverrait une colonne avec la première ligne contenant «ID».
csvtool namedcol ID csv_file.csv
Cela renverrait la quatrième ligne:
csvtool col 4 csv_file.csv
Si vous souhaitez supprimer la ligne d'en-tête:
csvtool col 4 csv_file.csv | sed '1d'
la source
Je me demande pourquoi aucune des réponses jusqu'à présent n'a mentionné csvkit.
documentation csvkit
Je l'utilise exclusivement pour la gestion des données csv et jusqu'à présent je n'ai pas trouvé de problème que je ne pourrais pas résoudre en utilisant cvskit.
Pour extraire une ou plusieurs colonnes d'un fichier cvs, vous pouvez utiliser l'
csvcut
utilitaire qui fait partie de la boîte à outils. Pour extraire la deuxième colonne, utilisez cette commande:page de référence csvcut
Si les chaînes du csv sont entre guillemets, ajoutez le caractère guillemet avec l'
q
option:Installez avec
pip install csvkit
ousudo apt install csvkit
.la source
Vous ne pouvez pas le faire sans un analyseur CSV complet.
la source
cut
compte?J'utilise ce code depuis un moment, ce n'est pas "rapide" à moins que vous ne comptiez "couper-coller depuis stackoverflow".
Il utilise les opérateurs $ {##} et $ {%%} dans une boucle au lieu d'IFS. Il appelle «err» et «die», et ne prend en charge que la virgule, le tiret et le tube en tant que caractères SEP (c'est tout ce dont j'avais besoin).
Exemple:
la source
Vous pouvez également utiliser la boucle while
la source