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

Système D'exploitation: OSX Méthode: à partir de la ligne de commande, donc en utilisant sed, cut, gawk, bien que de préférence pas de modules 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 de désir

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

Donc je veux 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 ou rien du tout, donc je suppose il ne lit pas Ligne par ligne.

25
demandé sur S1syphus 2010-04-16 15:28:31

4 réponses

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 terminaisons de ligne de style DOS ou même de style Mac, cela peut provoquer un comportement étrange. Essayez d'exécuter file in.csv et voyez ce qu'il arrive.

$ 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 l'Outil dos2unix pour convertir le fichier.

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

30
répondu Thomas 2018-01-05 12:45:53

J'ai copié-collé votre exemple d'entrée, l'ai enregistré comme dans.csv, puis a couru 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 le Terminal.application sur OS X 10.5

11
répondu Personman 2010-04-16 11:32:22

Pour moi, cut produit le résultat attendu:

cut -d, -f1 < in.csv > out.txt
2
répondu Michal Čihař 2010-04-16 11:32:39

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 nouvelles lignes avant le traitement, et les ajoute ensuite
  • -a mode autosplit-diviser les lignes d'entrée dans le tableau @F. Par défaut à fractionnement sur les espaces.
  • -e exécute le code perl
  • -F modificateur autosplit, dans ce cas se divise sur ,

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

0
répondu Chris Koknat 2015-11-13 22:30:43