Question

J'ai besoin de votre aide sur une entrée multiple ligne dans différentes colonnes. Et faire la même chose avec toutes les entrées dans le fichier.

Exemple de fichier (affichant 2 entrées seulement, il y a beaucoup d'autres comme celles-ci):

>ABC
*
AGA-AUUCUC-CGGUUCAAUCU
|||
UCUAUAACCGCGCCGAGUUAGU

>ABC
*
AGAUAU-GCUGCAGGCUCAAUUG
||||||
UCUAUAACCGCG-CCGAGUUAGU

Format de fichier requis:

>ABC AGA-AUUCUC-CGGUUCAAUCU UCUAUAACCGCGCCGAGUUAGU
>ABC AGAUAU-GCUGCAGGCUCAAUUG UCUAUAACCGCG-CCGAGUUAGU

Je suis en mesure de convertir entrée unique en format requis par:

tr '\n' '\t' <test3 | awk '{print $1,$3,$5}'

Mais comment puis-je le faire avec toutes les entrées en lecture du fichier entier?

Était-ce utile?

La solution

Je pense que vous étiez sur la bonne voie avec votre solution awk originale. Essaye ça; Je pense que c'est une bonne combinaison de lisible et efficace:

awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile

L'idée est de dire awk pour traiter les lignes vides (2 consécutifs) que les sauts de lignes séparateurs d'enregistrement. Ensuite, chaque strophe est traité comme un seul enregistrement, et les espaces blancs (dans ce cas, les nouvelles lignes simples) sépare les champs. C'est assez semblable à ce que vous faisiez avec tr, sauf que maintenant se awk courir à travers le fichier entier le traitement d'une strophe à la fois.

Autres conseils

Vous pouvez utiliser awk comme ceci:

awk 'NR%2 { printf "%s%s", $0, (NR+1)%6 ? " " : "\n" }' < test


Explication:

Vous devez connaître ces deux choses à propos awk:

  • la syntaxe est condition { commands }, où commands sont executied si condition est vrai (non nul).

  • NR est le numéro de la fiche de courant (qui est le numéro de la ligne), en commençant par 1.


Ici, la condition est NR%2, qui est non nulle pour les lignes impaires. Ainsi, la commande est exécutée uniquement pour les lignes impaires, qui sont celles que vous souhaitez imprimer. Les lignes paires sont mis au rebut en silence.

Le printf imprime toutes les lignes impaires, suivi d'un espace ou un saut de ligne. Votre entrée répète tous les 6 lignes, et que vous voulez un saut de ligne après les lignes 5, 11, 17, etc . Vous pouvez ajouter 1 à chacun de ces chiffres pour le rendre divisible par 6, de sorte que la formule est (NR+1)%6 0 pour ces chiffres.

(NR+1)%6 ? " " : "\n" évalue un espace pour les lignes 1 et 3, et un saut de ligne pour la ligne 5. Il répète ensuite pour 7, 9 et 11; et ainsi de suite.

Voici une façon en utilisant Perl:

perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }'

Ce imprimera le 1er, 3e, 5e, 7e, etc., les lignes du fichier. Après le 5, 11, 17, etc., lignes, il affichera une nouvelle ligne; après d'autres lignes, il imprime uniquement un onglet.

(Note:.. Cela suppose qu'il ya exactement une ligne vide entre les groupes successifs de cinq lignes Si c'est pas le cas, s'il vous plaît préciser)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top