Nous allons générer un fichier csv avec les valeurs ci-dessous
yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9
J'ai besoin d'extraire des données et de créer des fichiers en fonction de la deuxième colonne. Si c'est 577, la ligne entière doit être extraite et placée dans un fichier séparé. Je veux dire que j'ai besoin d'un fichier ayant des lignes avec la deuxième colonne en tant que 577 seul et un autre fichier avec la deuxième colonne en tant que 132 seul
J'ai essayé d'utiliser IF mais je n'ai pas fonctionné
Réponses:
Utilisation
awk
:Cela va créer les deux fichiers
577.csv
et132.csv
dans votre répertoire actuel.La commande ci-dessus suppose que vous ne pouvez avoir que
132
ou577
comme deuxième champ. Il créera un nom de fichier pour chacune des valeurs trouvées dans le deuxième champ de l'ensemblefile.csv
.S'il existe d'autres valeurs que les deux qui vous intéressent et que vous souhaitez ignorer ces lignes, procédez à la place:
la source
awk
implémentations de bogues qui ne peuvent pas être utiliséesprint > $2 ".cvs"
. Vous sur ceux -ci , doivent d' abord calculer le nom de fichier, puis procédezprint
:fname = $2 ".cvs"; print > fname
.J'aime la
awk
solution de terdon , mais par souci d'exhaustivité, voici une suggestion utilisant uniquementbash
Il produira des fichiers
577.csv
et132.csv
dans le répertoire courant.la source
Pour extraire tous les 577 vers stdout
- edit 1 Corrigé, basé sur le commentaire de @ terdon ci-dessous pour éviter les fausses correspondances quand au moins 3 virgules en ligne avec 577.
Mais je pense que sa
awk
solution est plus complète.la source
foo577bar
ouyp9012,132,8,577
..*
peuvent également correspondre à des virgules, vous ne savez donc pas à quel champ vous correspondez. Pourrait être le deuxième, pourrait également être le 45e. Ma deuxième plainte était fausse, vous avez raison de dire que les virgules protègent contre les correspondancesfoo577bar
.En utilisant
csvkit
:Les
-c 2
marquescvsgrep
considèrent la deuxième colonne et-m 577
nous lui demandons de faire correspondre la chaîne577
de cette colonne.Ce qui suit sera écrit à
output.csv
:Pour faire correspondre un certain nombre de chaînes et écrire la sortie dans un fichier pour chaque chaîne:
Cela créera les deux fichiers
output-132.csv
etoutput-577.csv
.la source