web-dev-qa-db-fra.com

Analyse de la première colonne d'un fichier csv dans un nouveau fichier

Système d'exploitation: Méthode OSX: à partir de la ligne de commande, donc en utilisant sed, cut, gawk, bien que de préférence aucun module d'installation.

Essentiellement, j'essaie de prendre la première colonne d'un fichier csv et de l'analyser dans un nouveau fichier.

Exemple de fichier d'entrée

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

Sortie désirée

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

Je veux donc la première colonne.

Voici ce que j'ai essayé jusqu'à présent:

awk -F"," '{print $1}' in.csv > out.txt

awk -F"," '{for (i=2;i<=NF;i++)}' in.csv > out.txt

awk -F"," 'BEGIN { OFS="," }' '{print $1}' in.csv > out.txt

cat in.csv | cut -d \, -f 1 > out.txt

Aucun ne semble fonctionner, soit ils impriment simplement la première ligne, soit rien du tout, donc je suppose qu'il ne parvient pas à lire ligne par ligne.

34
S1syphus

Votre dernière option fonctionne parfaitement pour moi:

$ cat > in.csv  # Then pasted the example input followed by Ctrl+D:
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
[Ctrl+D]
$ cat in.csv | cut -d, -f1
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

Peut-être que les fins de ligne vous mordent ici? Si le fichier a des fins de ligne de style DOS ou même de style ancien Mac, cela peut provoquer un comportement étrange. Essayez d'exécuter file in.csv et voyez de quoi il s'agit.

$ file in.unix.csv
in.unix.csv: ASCII text
$ file in.dos.csv
in.dos.csv: ASCII text, with CRLF line terminators

Si ce dernier est votre situation, utilisez le dos2unix outil pour convertir le fichier.

Edit: Sur OS X, il semble flip est ce que vous voulez .

40
Thomas

J'ai copié-collé votre exemple d'entrée, l'ai enregistré sous in.csv, puis j'ai exécuté votre première ligne,

awk -F"," '{print $1}' in.csv > out.txt

et cela a parfaitement fonctionné, comme ceci:

$ emacs in.csv
$ cat in.csv 
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
$ awk -F"," '{print $1}' in.csv > out.txt
$ cat out.txt 
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3

C'est dans Terminal.app sur OS X 10.5

12
Personman

Pour moi, la coupe produit le résultat attendu:

cut -d, -f1 < in.csv > out.txt
4
Michal Čihař

Si Perl est une option:

Perl -F, -lane 'print $F[0]' in.csv > out.txt

Ces options de ligne de commande sont utilisées:

  • -n boucle autour de chaque ligne du fichier d'entrée
  • -l supprime les sauts de ligne avant le traitement et les ajoute à nouveau après
  • -a mode autosplit - divise les lignes d'entrée en @F tableau. Par défaut, la division sur un espace blanc.
  • -e exécute le code Perl
  • -F modificateur de fractionnement automatique, dans ce cas, se divise sur ,

@F est le tableau de mots de chaque ligne, indexé en commençant par $F[0]

0
Chris Koknat