用AWK或Sed替换字典?

时间:2013-09-03 19:44:42

标签: dictionary awk sed substitution

你有一个字典,Dictionary.txt和一个输入文件inFile.txt。字典会告诉您可能的翻译。 unix shell: replace by dictionary中类似问题的解决方案似乎是硬编码我无法完全理解的here内容。您可以提供比字典更好的替换技术,但AWK / Sed脚本应该能够读取多个文件,最简单的情况下只能读取一个字典文件和一个文件。

如何用字典用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
     

来自Command的输出,我们正在寻找像awk/sed {} Dictionary.txt inFile.txt 这样的命令

one one hello hallo two three hallo fem fem
     

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

请注意,它会将连续空白链的任何链压缩为单个空白字符。告诉我们这是否是一个问题。

答案 2 :(得分:3)

修改

这回答了原帖。没有回答多次编辑和重组的问题...... 最重要的是,我从提出这个问题的OP得到-1 ......该死的!

是的,在awk中简单得多:

这将打印两列作为第二列的值:

awk '{print $2, $2}' file

如果您想先使用第二列翻页:

awk '{print $2, $1}' file

答案 3 :(得分:3)

如果ReplaceLeftWithRight_where_you_do_not_replace_things.txt包含字符串替换对,则第一列中的任何文本都应替换为第二列,

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

然后将其输出传递给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。

很抱歉,如果我误解了您的问题陈述。