0
votes

Extraire deux types de valeurs différents à partir d'un fichier et l'imprimer à un fichier de sortie

J'ai un fichier dans lequel les données ressemblent à:
xxx

Je veux extraire les valeurs de "alphabet d'acide aminé" et de "longueur de séquence dans un fichier de sortie", et Il faut ressembler à: xxx

comme je suis nouveau à bash, tout ce que je pourrais essayer jusqu'à présent est: xxx

Mais, je ne veux pas le mot "alphabet d'acide aminé" dans la sortie. Je veux seulement les valeurs de "Alphabet Amino Acid" et "Longueur de séquence" comme deux colonnes.

Puis-je obtenir de l'aide de quoi faire? Merci d'avance.


6 commentaires

Qu'est-ce que tu as essayé jusque-là?


@ markp-fuso comme je suis nouveau à bash, tout ce que je pourrais essayer jusqu'à présent est: grep -i "alphabet acide amino = $ i" test.txt >> out.txt mais, je n'ai pas t veux le mot "alphabet acide aminé" dans la sortie. Je veux seulement les valeurs de "alphabet d'acide aminé" et "longueur de séquence" comme deux colonnes.


@ DAVI54, veuillez envelopper vos échantillons dans des balises de code (pour le rendre claire sage). Ajoutez également vos efforts que vous avez montrés dans votre commentaire dans votre question s'il vous plaît.


@ Ravindersingh13 Cela a-t-il l'air mieux maintenant? J'ai essayé de mettre mes échantillons de données dans des balises de code et ajouté ma commande éprouvée dans la question. Merci.


@ DAVI54 Pour formater le code, n'oubliez pas d'utiliser le bouton {} ou d'indenter les lignes avec 4 espaces. N'utilisez pas de balises comme ou etc autour du code. Acclamations.


Ah d'accord. Mes excuses, c'est juste mon manque d'expérience avec cela. Gardera cela à l'esprit. Merci.


4 Réponses :


2
votes

En supposant que les deux champs existent pour tous vos enregistrements:

awk '/^Amino acid alphabet/{printf $NF FS} /^Sequence length/{print $NF}' file
19 115
20 126
19 131


3 commentaires

Merci, ça marche. Cependant, il montre la sortie sur le terminal. Existe-t-il un moyen de l'imprimer dans un fichier?


Pour imprimer la sortie de n'importe quelle commande shell dans un fichier: commande> sortie_file.txt


Merci de votre aide. J'utilisais >> pour imprimer au fichier et cela me donnait des erreurs. Je vais aussi lire la commande AWK.



2
votes

Ce code: grep -i "alphabet acide aminé = $ i" test.txt >> out.txt inclut l'expansion de shell de $ i . Si vous n'avez pas donné de valeur à i , le motif de recherche est résolu à alphabet d'acide aminé = et trouvera ainsi chaque ligne qui contient cela. Le i changerait le modèle de recherche si $ i avait une valeur.

Il existe de nombreuses façons d'obtenir ce que vous voulez avec BASH. on consiste à utiliser Grep avec PCRE (Perl-style) regex activé: xxx

(? <= string) dit à Grep que pour le reste à Correspondre, il doit avoir été précédé de chaîne , mais chaîne ne fait pas partie du match. -po sont les options pour activer PCRE (STYLE PERL) et d'imprimer uniquement la correspondance, plutôt que la ligne entière dans laquelle il y avait une correspondance.

Notez que la sortie Rediriger est >> si vous souhaitez ajouter à un fichier s'il contient déjà des lignes, > écrasera un fichier existant s'il existe (sans demander de confirmation!)


3 commentaires

Je vois que vous le vouliez dans des colonnes pour chaque type, que ce qui précède ne le fait pas, mais peut être fait avec un pérl one-liner, mais si vous avez une solution de travail comme celle de Thanasisp, je m'inclinerai.


@Thatanasisp merci! Je pense que cela pourrait être délicat de faire en un seul grep, car les chaînes demandées sont sur différentes lignes, mais la production devrait être sur une. Je serais enclin à l'envelopper dans un Perl -E ... mais cela semble loin de ce que l'OP voulait.


Oui droite. J'essaie juste de créer une réponse de ce grep. Également pâte -d '' << (Pattern Grep1) <(Pattern Grep2) Avec exactement votre commande Grep pourrait fonctionner (pour Bash Shell uniquement)



3
votes
$ awk -v RS= '{print $(NF-4), $NF}' file
19 115
20 126
19 131

2 commentaires

-v rs = définit les lignes vides comme séparateur d'enregistrement? C'est magnifique, @ed, lol. Un espace sur ces lignes lancera une clé à singe, mais je l'aime.


@Paulhodges Oui, c'est également appelé "mode de paragraphe" et est l'approche commune pour traiter le problème assez courant des blocs de texte séparés par des lignes vierges.



2
votes

sed peut le faire aussi. xxx

/ ^ alphabet d'acide aminé = / h stocke la première ligne dans le tampon de sauvegarde .
/ ^ Longueur de séquence = / { déclenche toutes les étapes à l'intérieur des boucles.
H ajoute la ligne en cours au tampon de sauvegarde.
x sonne la mémoire tampon de sauvegarde à l'espace de travail.
s / [^ 0-9] + / / g; modifie chaque séquence sur les non-chiffres dans un seul espace.
Cela inclut la nouvelle ligne.
s / ^ //; supprime l'espace de tête.
p imprime la ligne de sortie de ce jeu de données.


0 commentaires