2016-12-20 1 views
0

J'ai deux listesboucle pour remplacer la chaîne par autre dans un fichier différent

list1:

A:1 
B:3 
C:1 
D:5 

liste2:

1:blue 
3:green 
5:red 

Comment puis-je faire pour avoir quelque chose comme:

sortie désiré (fichier3):

A:blue 
B:green 
C:blue 
D:red 

Et voici mon code désoeuvrement ...

#!/system/bin/bash 
list1=$(cat file1) 
list2=$(cat file2) 
for i in "$list1"; do 
num_file1=$(echo $i | cut -d ":" -f 2) 
string_file2=$(cat $list2 | grep "$num_file1" | cut -d ":" -f 2) 
echo -e "$i" | sed "s/$num_file1/$string_file2/" > list3 
done 

J'ai essayé aussi sed 's/"$num_file1"/"$string_file2"/' et beaucoup d'autres, mais a échoué chaque fois pour ce que je veux .. Où je suis fatigué avec sed ??

Ps: son sur Android ... et quelques commandes sont embué ...

+0

Mettez 'num_file1 = ...' et la ligne suivante dans la boucle. – PeterMmm

+0

@PeterMmm j'ai essayé mais ne fonctionne toujours pas ... –

+0

sed: inégalé '/' –

Répondre

0

Donnez cette ligne awk un essai:

awk -F':' 'NR==FNR{k[$1]=$2;next}{print $1 FS k[$1]}' f2 f1 

Je n'ai pas testé le code, mais il devrait marcher.

Remarque cela suppose que tous IDX dans fichier1 nous avons l'entrée correspondante dans fichier2

+0

je ai essayé, mais son ne fonctionne pas –

0

La solution awk est parfaitement bien. En utilisant des commandes moindres, vous pouvez dire:

sort -t \: -k 2 list1 | join -t \: -1 2 - list2 | cut -d \: -f 2,3 | sort -t \: 
+0

j'ai oublié de dire itd sur android ... et il y a une commande de brume .. Et 'join' est une partie des commandes embrouillées (comme la pâte et quelques autres ..) –

+0

Vous devriez éditer votre question originale, puisque c'est une omission assez importante. –