-8

辞書 Dictionary.txt と入力ファイル inFile.txt があります。辞書は可能な翻訳について教えてくれます。UNIXシェルでの同様の問題の解決策:辞書による置換は、ここでは完全には理解できないものをハードコードしているようです。辞書よりも優れた置換手法を考え出すことができますが、AWK/Sed スクリプトは複数のファイルを読み取ることができるはずです。最も単純なケースでは、1 つの辞書ファイルと 1 つの infile のみです。

辞書をAWKまたはSedでエレガントに置き換えるには?


Dictionary.txt

1 one
2 two 
3 three
four fyra
five fem

inFile.txt

one 1 hello hallo 2 three hallo five five

コマンドからの出力、次のようなコマンドを求めていますawk/sed {} Dictionary.txt inFile.txt

one one hello hallo two three hallo fem fem

置換を具体的に選択したが、1 対 1 の置換が機能しない AWK の例。

awk 'BEGIN {
 lvl[1] = "one"
 lvl[2] = "two"
 lvl[3] = "three"
 # TODO: this does not work 
 # lvl[four] = "fyra"
 # lvl[five] = "fem"
 # lvl[one] = "one"
 # lvl["hello"] = "hello"
 # lvl[hallo] = "hallo"
 # lvl[three] = "three"
 }
NR == FNR {
  evt[$1] = $2; next
  }
{
   print $1, evt[$2], $3, $4, evt[$5], $6, $7, evt[$8], evt[$9]
   #TODO: this dos not work, eg. one-one mapping   
   #   print evt[$1], evt[$2], evt[$3], evt[$4], evt[$5], evt[$6], evt[$7], evt[$8], evt[$9]
  }' dictionary.txt infile.txt
4

4 に答える 4

4
$ awk 'NR==FNR{map[$1]=$2;next} { for (i=1;i<=NF;i++) $i=($i in map ? map[$i] : $i) } 1' fileA fileB
one one hello hallo two three hallo fem fem

連続する空白のチェーンを単一の空白文字に圧縮することに注意してください。それが問題かどうか教えてください。

于 2013-09-03T22:24:22.147 に答える
4

gnu sed を使用している場合は、次のスクリプト ファイルをサポートします-f

`-f SCRIPT-FILE'
`--file=SCRIPT-FILE'
     Add the commands contained in the file SCRIPT-FILE to the set of
     commands to be run while processing the input.

たとえば、「c.sed」で置換を記述できます。

sed -f c.sed file

c.sed:

s/1/one/g
s/2/two/g
...

編集

ちょうど今、質問に awk のタグを付けていませんでした。確かに、awk ワンライナーの方が簡単です:(あなたの例で)

awk '$1=$2' file

テスト:

kent$  echo "1 one
2 two 
3 three
four fyra
five fem"|awk '$1=$2'
one one
two two
three three
fyra fyra
fem fem
于 2013-09-03T19:55:02.670 に答える
3

文字列置換のペアが含まれている場合ReplaceLeftWithRight_where_you_do_not_replace_things.txt、最初の列のテキストの出現は 2 番目の列に置き換えられる必要があります。

1 one
2 two 
3 three
four fyra
five fem

sedこれは簡単にスクリプトとして表現できます。

s/1/one/g
s/2/two/g
s/3/three/g
s/four/fyra/g
s/five/fem/g

sedこのsedスクリプトを作成するために簡単に使用できます。

sed 's%.*%s/&/g%;s% %/%' ReplaceLeftWithRight_where_you_do_not_replace_things.txt

次に、その出力を の 2 番目のインスタンスに渡しますsed

sed 's%.*%s/&/%;s% %/%' ReplaceLeftWithRight_where_you_do_not_replace_things.txt |
sed -f - someFile_Where_You_Replace_Things.txt

ファイル内のすべての一致を置き換えsomeFile_Where_You_Replace_Things.txt、出力を標準出力に出力します。

残念ながら、すべてsedの方言-f -が標準入力からスクリプトを読み取るオプションをサポートしているわけではありませんが、これは少なくともほとんどの Linux で機能するはずです。

問題文を誤解していたらすみません。

于 2013-09-03T20:46:21.267 に答える