Polucho
Polucho

Reputation: 23

AWK Replace strings by the same strings with underscores

I have three files. One is the original file, another contains a part of the lines of the original and another file with the modified parts have to replace the original. And do not even know where to start. Can you help me?

Match file:

a demandé de montrer
grandes vacances
de faire
a montré
a remis
bien posé
n '
quand il l '
arrière du véhicule
modèle essence

Replace file:

a_demandé_de_montrer
grandes_vacances
de_faire
a_montré
a_remis
bien_posé
n_'
quand_il_l_'
arrière_du_véhicule
modèle_essence

Original file:

A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes vacances on m'a demandé de montrer le bon.
A chacun son choix
A chaque fois c'est moi qui dois les recontacter.
A eux de faire leurs avis....
A l'achat, le vendeur m'a montré comment rabattre le siège arrière, mais quand il l'a remis en place, ce n'était pas bien posé.
A l'arrière du véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.

Desired output:

A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes vacances on m'a_demandé_de_montrer le bon.
A chacun son choix
J'avais droit aux grandes_vacances à l'entretien kit vacances.
A chaque fois c'est moi qui dois les recontacter.
A eux de_faire leurs avis....
A l'achat, le vendeur m'a_montré comment rabattre le siège arrière, mais quand il l'a_remis en place, ce n'était pas **bien_posé**.
A l'arrière_du_véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle_essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.

Upvotes: 1

Views: 109

Answers (5)

Ed Morton
Ed Morton

Reputation: 204628

With GNU awk for ARGIND (with other awks just add FNR==1{ARGIND++}):

$ cat tst.awk
ARGIND==1 { a[FNR] = $0; next }
ARGIND==2 { map[a[FNR]] = $0; next }
{
    for (m in map) {
        gsub(m,map[m])
    }
    print
}

$ awk -f tst.awk match.txt replace.txt original.txt
A 120km/h, la consommation tourne autour de 7.5l/100km si le vent est dans le dos...
A ce jour, je suis totalement satisfaite
A ce moment-là aux grandes_vacances on m'a_demandé_de_montrer le bon.
A chacun son choix
A chaque fois c'est moi qui dois les recontacter.
A eux de_faire leurs avis....
A l'achat, le vendeur m'a_montré comment rabattre le siège arrière, mais quand il l'a_remis en place, ce n'était pas bien_posé.
A l'arrière_du_véhicule, il était inscrit qu'il s'agissait d'une diesel, alors que c'est un modèle_essence.
A la décharge du garage nous avons constaté un changement de personnel (nouveau directeur nouveau préposé a l accueil) laissons leur un temps d adaptation ...
A la limite, chacun son garagiste.

Like all other solutions posted so far, the above will behave undesirably if you have regexp metachars in your match file or regexp capture group identifiers in your replace file. If that can happen use index() and substr() instead of gsub().

Upvotes: 0

Polucho
Polucho

Reputation: 23

This is the output the first three codes.This is the output the first two codes. Perhaps the encoding?

a_demand▒_de_montreraa_demand▒_de_montreria_demand▒_de_montrersa_demand▒_de_montrersa_demand▒_de_montreroa_demand▒_de_montrerna_demand▒_de_montrersa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montrerea_demand▒_de_montrerua_demand▒_de_montrerra_demand▒_de_montrer a_demand▒_de_montrerua_demand▒_de_montrerna_demand▒_de_montrer a_demand▒_de_montrerta_demand▒_de_montrerea_demand▒_de_montrerma_demand▒_de_montrerpa_demand▒_de_montrersa_demand▒_de_montrer a_demand▒_de_montrerda_demand▒_de_montrer a_demand▒_de_montreraa_demand▒_de_montrerda_demand▒_de_montreraa_demand▒_de_montrerpa_demand▒_de_montrerta_demand▒_de_montreraa_demand▒_de_montrerta_deman
d▒_de_montreria_demand▒_de_montreroa_demand▒_de_montrerna_demand▒_de_montrer a_demand▒_de_montrer.a_demand▒_de_montrer.a_demand▒_de_montrer.a_demand▒_de_montrer
a_demand▒_de_montrerAa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montreraa_demand▒_de_montrer a_demand▒_de_montrerla_demand▒_de_montreria_demand▒_de_montrerma_demand▒_de_montreria_demand▒_de_montrerta_demand▒_de_montrerea_demand▒_de_montrer,a_demand▒_de_montrer a_demand▒_de_montrerca_demand▒_de_montrerha_demand▒_de_montreraa_demand▒_de_montrerca_demand▒_de_montrerua_demand▒_de_montrerna_demand▒

I tried this..

    BEGIN {
    while ((getline ln1 < mt) > 0)
    {
        source[++s] = ln1;
    }
    while ((getline ln2 < rp) > 0)
    {
        replace[++r] = ln2;
    }
    }
    {
    for ( i = 1; i < s; i++)
        gsub (source[i], replace[i], $0)
        print;
    }
    

Upvotes: 0

user000001
user000001

Reputation: 33387

Here is one approach of solving this using awk:

#!/usr/bin/awk -f
FILENAME == ARGV[1] { m[FNR]=$0 } # Store the match word in an array
FILENAME == ARGV[2] { r[FNR]=$0 } # Store the replacement word in a second array
FILENAME == ARGV[3] { for (i in m) gsub(m[i],r[i]); print } # Do the replacement for every line in file3

Run it like this:

./script.awk match_file replace_file original_file

Upvotes: 1

Hambone
Hambone

Reputation: 16407

There may be a better way to do this, but if you would like to use AWK, you can asssign a variable for each file you read, build some arrays with the find and replace string, and then loop through each find/replace value:

awk '
  file == 1 { source[++s] = $0 }
  file == 2 { replace[++r] = $0 }
  file == 3 {
    for (i = 1; i < s; i++)
      { gsub (source[i], replace[i], $0)  }
    print
  }
' file=1 match_file \
  file=2 replace_file \
  file=3 original_file

I don't claim this is the most efficient way to do it, but I think it will do what you describe.

Upvotes: 1

karakfa
karakfa

Reputation: 67567

You didn't show any effort on the implementation but this should solve your problem.

awk -F"\t" 'NR==FNR{a[$1]=$2;next} 
                   {for(k in a) gsub(k,a[k])}1' <(paste search replace) text

create a lookup table, do the replacement based on lookup.

Upvotes: 1

Related Questions