-1
votes

Comment remplacer la virgule avant une chaîne spécifique avec \ n dans le fichier CSV

J'ai un fichier csv et je veux remplacer une virgule avec \ n après gca _ * .

entrée: xxx

sortie souhaitée: xxx < p> ma tentative: xxx


4 commentaires

Qu'avez-vous essayé? Vous avez étiqueté votre question avec AWK et SED, alors je m'attendais à voir un code AWK et SED que vous avez besoin d'aide.


J'ai essayé avec la commande SED, mais je n'ai pas fonctionné pour moi SED 'S / ASM * / \ N & / / / / / /' ordered_lines_per_genome.csv> Assembly_Repor_Table.csv


S'il vous plaît ajouter votre tentative de votre question. (Cela va probablement arrêter et peut-être inverser les bowvotes.) Nous aimerions vous aider à résoudre votre code, mais votre code devrait faire partie de la question. En outre, votre question indique que vous souhaitez ajouter une nouvelle ligne après GCA _ , mais dans votre sortie d'échantillon, la deuxième nouvelle ligne n'est pas après ce texte. Pouvez-vous clarifier?


La tuile dit que vous voulez remplacer avant une chaîne (je pense ASM ), ce qui est confirmé par votre sortie souhaitée et votre tentative. La première ligne de la question devrait être modifiée, vous mentionnez GCA _ ce qui n'est pas pertinent ici.


5 Réponses :


2
votes

avec GNU SED:

sed 's/,\(ASM[^,]*\)/\n\1/g' input.csv
  • \ (GCA _ [^,] * \ \), code>: correspond à GCA * code> suivi d'une virgule. Le \ (... \ \) code> Définissez un groupe que nous pouvons utiliser ultérieurement dans la chaîne de remplacement. LI>
  • Remplacement \ 1 \ n code>: insère le groupe ("GCA *") du match et ajoute une nouvelle ligne. LI> ul>

    Pour changer le fichier directement: P> xxx pré>

    ou pour corriger votre ligne de commande à partir du commentaire: p> xxx pré>

    ou mieux: pour prévenir les virgules suivis: p> xxx pré> p>


5 commentaires

Ne fonctionne pas dans BSD ou MacOS. Si vous ne savez pas si l'OP utilise la même version que vous le souhaitez, il vaut mieux construire votre réponse afin qu'elle soit portable.


@ghoti limité à "gnu sed"


@ghoti pourriez-vous fournir une réponse portable. Je voudrais en savoir plus.


Le problème est que non-GNU SED n'interprète pas la notation Backslash ansi comme \ n . Le moyen canonique d'intégrer une nouvelle ligne dans la chaîne de remplacement consiste à utiliser une nouvelle ligne littérale précédée d'une barre oblique inverse. Vous pouvez le faire dans BASH en utilisant le format citant, comme: SED $ 'S /, ASM / \\\ NASM / G' INPUT.CSV . Vous pouvez lire sur $ '..' ' sous "Citant" dans la page Bash Man.


Bien que dans ce cas, je pense que l'OP est vraiment à la recherche d'une scission tous les 16 champs, comme le suggéra Mickp, donc: SED $ 'S / S /, / \\\ N / 16; P; D' INPUT.CSV < / code> serait probablement ma solution.



2
votes

Ce simple GNU SED pourrait être ce que vous recherchez: xxx

  • s /, / \ n / 16 : remplace la 16e virgule , avec une nouvelle ligne \ n
  • p : imprime la ligne jusqu'à la première nouvelle ligne \ n
  • d : supprime le texte imprimé et démarre le cycle à nouveau avec le texte restant

    Il est basé sur un super Répondre par @potong .


5 commentaires

Une ligne d'explication sur ce que la commande sed signifie exactement, serait formidable.


Cela vient certainement d'une bonne réponse, mais c'est une réponse à une question différente. OP n'a pas précisé que gca_ sera toujours à la 16ème occurrence. 🤔


@Tomalak a ajouté expliquer :) @trebuchetms Il ressemble certainement à une longue ligne qui doit simplement être formaté pour être un CSV . Je pense que c'est une hypothèse juste que chaque CSV a la même quantité de champs et que je peux donc utiliser une constante, telle que 16 .


Je seconde cette hypothèse. En outre, l'exemple d'entrée de l'OP est déjà contradictoire: il n'y a pas de cga _ dans le deuxième enregistrement.


Une autre façon de faire cette méthode 16e virgule: xargs -d, -l 16 echo



2
votes

Vous devez supprimer le * code> et ajouter g code> pour global: xxx pré>

lorsque vous ne voulez pas la virgule, vous pouvez Utilisez P>

awk 'BEGIN {RS="[,]*ASM"} NF {print "ASM" $0}' ordered_lines_per_genome.csv


0 commentaires

0
votes

Solution AWK:

awk '{print gensub(",ASM","\nASM","g")}' ordered_lines_per_genome.csv > assembly_report_table.csv


0 commentaires

0
votes

Utilisation de Perl et en supposant que l'ID commence par ASM ..

$ cat maryem.txt
ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1,ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio,ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio
$ perl -pe ' s/([^^]ASM.+?,)/\n$1/g; s/^,//mg; ' maryem.txt
ASM190063v1,Escherichia coli(E.coli),strain=D3,562,SAMN03252421,PRJNA269191,Nanjing Agricultural University,2016-12-12,n/a,major,Complete Genome,full,Newbler v. 2.7,30-80x,Illumina Miseq; Roche 454 GS Junior,GCA_001900635.1
ASM301855v1,Escherichia coli (E. coli),strain=2013C-4225,562,SAMN08579596,PRJNA218110,CDC,2018-3-26,n/a,major,Complete Genome,full,HGAP v. 3,yes,76.725x,PacBio
ASM330895v1,Escherichia coli (E. coli),strain=2017C-4109,562,SAMN09534373,PRJNA218110,CDC,2018-7-10,n/a,major,Complete Genome,full,HGAP v. 3,yes,286.7X,PacBio
$


0 commentaires