2015-10-27 46 views
1

我有三个文件。一个是原始文件,另一个包含原始文件的一部分,另一个文件与修改后的部分必须替换原文件。 甚至不知道从哪里开始。你可以帮我吗?AWK用下划线用相同的字符串替换字符串

匹配文件:

 
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 

替换文件:

 
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 

原始文件:

 
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. 

所需的输出:

 
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. 

回答

1

可能有更好的方法来做到这一点,但如果您想使用AWK,您可以为每个读取的文件分配一个变量,使用查找和替换字符串构建一些数组,然后遍历每个查找/替换值:

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 

我不认为这是最有效的方法,但我认为它会做你所描述的。

+0

您是否尝试过使用我设置示例的文本? – Polucho

+0

是的 - 它不适合你吗? – Hambone

1

你没有表现出在执行任何努力,但是这应该解决您的问题。

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

创建一个查找表,根据查找做替换。

1

下面是解决这个用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 

运行这样的:

./script.awk match_file replace_file original_file 
+0

您是否尝试过使用我设置示例的文本? – Polucho

0

这是输出前三codes.This在输出前两码。也许编码?

 
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▒ 

我想这个..

 
    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; 
    } 

+0

对于用标签分隔的英文文本,任何一个选项都可以使用。 – Polucho

+0

您是否可以尝试发布任何解决方案? – Hambone

0

随着GNU AWK的ARGIND(与其他awks只需添加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. 

像至今发布的所有其他解决方案,上面会如果您的匹配文件中包含正则表达式元字符或替换文件中包含正则表达式捕获组标识符,则表现不理想。如果可能发生,使用index()substr()而不是gsub()

相关问题