insérer une ligne dans le fichier csv
J'ai un énorme fichier csv (sur ordre de téraoctets).
Maintenant, je veux insérer une ligne qui est un en-tête vers le haut.
Par exemple, si l'entrée.csv ressemble à ceci:
1,2,3,4
22,3,23,1
Je veux qu'il ressemble à
id1,id2,id3,id4
1,2,3,4
and so on
Comment puis-je le faire à partir de la coquille, terminal, awk, bash?/
OriginalL'auteur Fraz | 2012-11-15
Vous devez vous connecter pour publier un commentaire.
En place, à l'aide de sed:
edit:
@Ed Morton points, à l'aide de sed avec le
-i
commutateur sed d'éditer le fichier en place, et peut donc être dangereux lors de l'édition des fichiers volumineux. Si vous fournissez un préfixe après la-i
option, puis sed crée une copie de sauvegarde. Donc, quelque chose comme ce serait plus sûr:Le fichier d'origine sera alors situé dans
file.csv.bak
cmd file > tmp && mv tmp file
et vous savez que vous êtes en sécurité.vous avez raison, ce n'est pas particulièrement sûr pour les très gros fichiers comme celle en question. J'ai édité ma réponse à fournir une alternative plus sûre, toujours à l'aide de sed.
OriginalL'auteur Lee Netherton
C'est simple :
à l'aide de la coquille simple concaténation.
MODIFIER
après le fil de discussion ci-dessous, je propose ceci :
head.txt
Alors :
il n'est pas facile à faire, même quand le faire sans un fichier temporaire (comme dans ma réponse). Le problème, c'est que vous êtes physiquement déplacer toutes les données dans votre fichier en baisse de 16 octets.
ah.. ok.. j'obtiens une erreur de commande. son une requête de longue durée.. donc, ici, il est { echo "mkey1,merchant_sign,drapeau, default,E1,E2,E3,E4,E5,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E20,E21,E22,E23,E24,E25,E26,E27,E28,E29,E30,E31,E32,E33,E34,E35,E36,E37,E38,E39,E40,E41,E42,I1,I2,I4,I5,I6,I7,I8,I9,I10,I11,I12,I13,I14,I15,I16,I17,I18,I19,I20,I21,I22,I23,I24,I25,I26,I27,I28,I29,I30,I31,I32,I33,I34,I35,I36,I37,I38,I39,I40,I41,I42,I43,I44,I46,I47,I48,I50,I51,I52,I53,I54,I55,I56,O1,O2,O3,O4,O5,O6,O7,O8,O9,benchmark_score,julian,poids " ; chat prepared_input.csv ; } > mahout_input.csv
est certainement la création d'un fichier temporaire. Goo chance à tous.
voir mon post édité
OriginalL'auteur Gilles Quenot
Modifier. Quand j'ai écrit cette réponse, j'ai oublié le "to" une partie de la question. Par conséquent, ne pas utiliser la méthode présentée ici. J'ai encore quitter ce poste, comme il fait de la publicité de l'utilisation de ce merveilleux outil,
ed
, l'éditeur de texte standard.Comme d'habitude,
ed
est l'éditeur de texte standard. La solution à l'aide desed -i
n'est pas, comme il le mentionne, "modifier le fichier en place". Au lieu de cela, il affiche son contenu dans un fichier temporaire, puis renomme ce fichier à l'original. Ce n'est vraiment pas bon pour les gros fichiers!À l'aide de
ed
au lieu vraiment modifier le fichier. Quelque chose le long des lignes suivantes:Explication:
1
va à la première ligne,i
passe en mode insertion, puis nous insérerid1,id2,id3,id4
puis.
pour revenir au mode normal, etwq
à écrire et à cesser de fumer.Avec cette méthode, vous êtes vraiment en modifiant le fichier et il est deux fois plus rapide que le sed méthode. Aussi,
ed
est connu pour être "grand fichier en toute sécurité"!Fait.
ed
va lire tout le fichier dans un buffer et supprimez le fichier d'origine avant l'écriture du tampon du fichier. Il sera très lent et n'est pas sûr.Ouais, c'est ce que l'édition d'un fichier signifie 🙂
Si vous savez que vous ne devriez pas induire en erreur les OP en disant "Pas de fichier temporaire créé, pas de tampons, rien!".
Fixe!
OriginalL'auteur gniourf_gniourf
Il n'y a pas de moyen facile, vous allez avoir à réécrire le fichier. Probablement la façon la plus sûre est de
IHTH
mon expérience est que { .... } est effectivement un shell interne est exécuté. Il est donc de 1/2 de 1, 5 de l'autre. Bonne chance.
Non,
( )
est un shell interne est exécuté alors que{ }
est un regroupement.Est-il un moyen de ne pas "echo" le contenu entier du fichier.. pour une raison quelconque, il est pritining tout le contenu du fichier.. et c'est vraiment énorme fichier?
désolé, je suis conscient de la différence entre les deux, mon code personnel utilise
{ .. }
whenenver c'est possible, mais dans le cas de plusieurs téraoctets de fichiers, je ne vois pas qu'il y aurait un rendement significatif de la différence. Mon metier, lors de l'utilisation deptree
sur{ ... }
groupements ont montré qu'une nouvelle procédure a été créée pour gérer la sortie. Je n'ai pas le temps maintenant de créer un cas de test de revoir ce point. Bonne chance à tous.OriginalL'auteur shellter