你有一个字典,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
答案 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。
很抱歉,如果我误解了您的问题陈述。