Modification fichier texte et recherche recursive de noms espacés par tabulation
Bonjour,
dans le cadre de mon stage j'aimerai modifier un fichier à ma convenance pour le traiter par la suite en python, débutante en bash depuis ce matin, tout ne marche pas comme je veux >.< :
le fichier de départ ressemble à :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
22 0|71 ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815
21 0|69 ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815
17 0|65 ENSGGOP00000021128 ENSCJAP00000039513
15 0|63 ENSGGOP00000021128
11 0|61 ENSGGOP00000021128
10 ENSGGOP00000021128
16 ENSCJAP00000039513
20 0|68 ENSMUSP00000023509 ENSRNOP00000050815
18 ENSMUSP00000023509
19 ENSRNOP00000050815 |
La première colonne correspond au nom de l'espèce (1 à 22). La deuxième colonne au nom du gène dans cette espèce, de type x|x, xx|x, ... xxxx|xxxx. Les autres colonnes correspondent au nom du gène dans les espèces actuelles descendantes de celle-ci (type : ENSCJA.......).
Je veux récupérer parcourir le fichier ligne par ligne et remplacer UNE fois le nom du gène de l'espèce i chez son ancêtre (une des lignes qui précède). En gros, l'espèce 21 a un gène 0|69 qui correspond aux gènes "ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815", je veux récupérer le nom "0|69" et le remplacer à sa première occurrence c'est-à-dire l'espèce 22 0|71 pour obtenir : "22 0|71 0|69".
Je veux obtenir :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
22 0|71 0|69
21 0|69 0|65 0|68
17 0|65 0|63 ENSCJAP00000039513
15 0|63 0|61
11 0|61 ENSGGOP00000021128
10 ENSGGOP00000021128
16 ENSCJAP00000039513
20 0|68 ENSMUSP00000023509 ENSRNOP00000050815
18 ENSMUSP00000023509
19 ENSRNOP00000050815 |
Le fichier fais 340 000 lignes, le séparateur dans le fichier source est la tabulation.
Voici mon code mais il ne me modifie pas les noms de gènes par le nom "xxxx|xxxx" (avec x étant des chiffres). J'ai vu qu'il existait le awk mais pas si simple (>.<)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
#! /bin/bash
expand -t 1 OUTPUT > OUTPUT2
val=10
while read ligne
do
nom=$(echo "$ligne" | cut -f2 -d' ' ) # awk {'print $2'}
gene=$(echo "$ligne" | cut -f3- -d' ')
if [ "${#nom}" -lt "$val" ]
then
echo "$nom"
#echo "$gene"
sed -i 's/$gene/$nom/' OUTPUT2
fi
done <OUTPUT2
sed 's/ /\t/' OUTPUT2 |
Si quelqu'un peut m'aider s'il vous plaît !!