Fractionner un fichier ou extraire des lignes qui diffèrent selon un motif

J’ai un fichier séparé par tabulation comme ceci:

Supercontig_1.1 400 1500 1 4 Supercontig_1.1 400 1500 2 4 Supercontig_1.1 20000 138566 1 1 Supercontig_1.1 20000 138566 2 1 Supercontig_1.2 300 1000 1 2 Supercontig_1.2 300 1000 2 2 Supercontig_1.2 1300 15000 1 2 Supercontig_1.2 1300 15000 2 2 Supercontig_1.3 0 10000 1 5 Supercontig_1.3 0 10000 2 5 

Et je veux extraire toutes les lignes basées sur le modèle “Supercontig_1.X” dans un fichier séparé. Ie toutes les lignes avec Supercontig_1.1 dans un fichier, toutes les lignes avec Supercontig_1.2 dans un autre … J’ai essayé de regarder dans la commande “sed“, mais je ne sais pas comment l’utiliser lorsque le modèle de recherche n’est pas le même pour toutes les lignes.

One way using awk :

 awk '{ print $0 >$1 }' infile 

Cela donne:

 ==> Supercontig_1.1 <== Supercontig_1.1 400 1500 1 4 Supercontig_1.1 400 1500 2 4 Supercontig_1.1 20000 138566 1 1 Supercontig_1.1 20000 138566 2 1 ==> Supercontig_1.2 <== Supercontig_1.2 300 1000 1 2 Supercontig_1.2 300 1000 2 2 Supercontig_1.2 1300 15000 1 2 Supercontig_1.2 1300 15000 2 2 ==> Supercontig_1.3 <== Supercontig_1.3 0 10000 1 5 Supercontig_1.3 0 10000 2 5 

Je ne vois pas vos champs séparés par une virgule, uniquement des espaces. Changer le séparateur de champs ( FS ) si c'est le cas, comme: BEGIN { FS=","; } BEGIN { FS=","; } au début du script.

Cela pourrait fonctionner pour vous (GNU sed):

 sed -r ':a;$!N;s/^((\S*)\s.*)\n\2.*/\1/;ta;s/(\S*).*/\/^\1\/w\1/;P;D' file | sed -nf - file 

Cela ne fonctionnera que si le fichier est sortingé.

Si le fichier n’est pas sortingé, utilisez:

 sort -u -k1,1 file | sed -r 's#^(\S*).*#/^\1/w\1#' | sed -nf - file