4

この投稿と同様のことを行う必要があります (ただし、ひねりを加えています)。それが私が尋ねる理由です。

UNIX シェル: 辞書で置換

私は辞書(dict.txt)を持っています。スペースで区切られており、次のように表示されます。

V7 モメンタム

B6 クォンタ

....

(ある意味で、最初の列はキーで、2 番目の列は値です)

ユーザー ファイル (user.txt) があり、キーの出現 (V7、B6 など) が含まれています。ねじれは、キーが独自の列にないことです (したがって、上記の投稿の方法は適用されません)。

ユーザー ファイル (user.txt) は、文字列として表示できます。辞書から検索された値 (Momentum) によって、スペースで区切られているか、他の文字で区切られているかに関係なく、キーのすべての出現箇所 (V7 など) を置き換えたいだけです。

例えば:

「We have V7 as input」 --> に変更する必要があります --> 「We have Momentum as input」

"We have somethingV7_as input" --> 変更する必要があります --> "We have somethingMomentum_as input"

4

3 に答える 3

10

使用法:awk -f foo.awk dict.dat user.dat
http ://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
http://www.gnu.org/software/gawk/manual/html_node/Arrays.html

NR == FNR {
  rep[$1] = $2
  next
} 

{
  for (key in rep)
    gsub(key, rep[key])
  print
}
于 2012-07-26T22:44:06.240 に答える
3

これはあなたのために働くかもしれません(GNU sed):

sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' dict.txt | sed -f - user.txt
于 2012-07-27T06:43:50.847 に答える
3

辞書のキーに英数字しか含まれていない限り、この Perl は必要なことを実行します。

use strict;
use warnings;

open my $fh, '<', 'dict.txt' or die $!;
my %dict =  map { chomp; split ' ', $_, 2 } <$fh>;
my $re = join '|', keys %dict;

open $fh, '<', 'user.txt' or die $!;
while (<$fh>) {
  s/($re)/$dict{$1}/g;
  print;
}
于 2012-07-27T00:01:23.633 に答える