Dictionary 是否可以用AWK或Sed替换词典?

Dictionary 是否可以用AWK或Sed替换词典?,dictionary,awk,sed,substitution,Dictionary,Awk,Sed,Substitution,您有一个字典dictionary.txt和一个输入文件infle.txt。字典告诉你可能的翻译。中类似问题的解决方案似乎对我无法完全理解的事情进行了硬编码。您可以提出比dictionary更好的替换技术,但是AWK/Sed脚本应该能够读取多个文件,在最简单的情况下,只有一个dictionary文件和一个infle 如何用AWK或Sed优雅地替换字典 范例 字典.txt infire.txt 从命令的输出中,我们正在寻找类似于awk/sed{}Dictionary.txt infle.txt的命令

您有一个字典dictionary.txt和一个输入文件infle.txt。字典告诉你可能的翻译。中类似问题的解决方案似乎对我无法完全理解的事情进行了硬编码。您可以提出比dictionary更好的替换技术,但是AWK/Sed脚本应该能够读取多个文件,在最简单的情况下,只有一个dictionary文件和一个infle

如何用AWK或Sed优雅地替换字典

范例

字典.txt

infire.txt

从命令的输出中,我们正在寻找类似于awk/sed{}Dictionary.txt infle.txt的命令

AWK示例,其中专门选择了替换件,但一个替换件不起作用


如果您有gnu sed,它支持带有-f的脚本文件:

例如,你可以用c.sed写替换词

sed -f c.sed file
示例c.sed:

编辑

刚才你没有用awk来标记这个问题,当然,awk-one-liner会更简单:用你的例子

awk '$1=$2' file
测试:

编辑 这是对原文的回答。不回答多次编辑和重新构造的问题。。。 最重要的是,我从问这个问题的OP那里得到了a-1。。。该死

是的,在awk中要简单得多:

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

awk '{print $2, $2}' file
如果要使用第二列翻转第一列,请执行以下操作:

awk '{print $2, $1}' file
如果ReplaceLeftWithRight\u where\u you\u not\u replace\u things.txt包含成对的字符串替换,其中第一列中出现的任何文本都应替换为第二列

1 one
2 two 
3 three
four fyra
five fem
然后,这可以简单地表示为sed脚本

您可以简单地使用sed来创建此sed脚本:

然后将其输出传递给sed的第二个实例:

要替换文件someFile\u中的所有匹配项,请替换\u Things.txt并将输出打印为标准输出

遗憾的是,并非所有sed方言都支持-f-选项来从标准输入读取脚本,但至少在大多数Linux上是这样

对不起,如果我误解了你的问题陈述

$ 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

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

@hhh,另一个文件也是基于列的?我不知道你真正的replaceRule文件是什么样子。如果有一些字符像*+[……,使用正则表达式进行替换是不可靠的。+1是为了反驳OP的肆意否决。如果你的问题不好,不要惩罚回答它的人。+1是因为我这边的人表现出耐心。+1是因为修改了类似的答案-尽管这个答案忽略了关于多个输入文件的问题,这是我在最早的时候遇到的一件事第一次编辑。是的,我这样做是因为我在关注你的原始帖子,然后你编辑了…这并没有回答编辑后的问题…对不起,这不是我想要的-我的原始问题被错误地拼写了-现在应该是清楚的-1直到更正。+1来反击OP的肆意否决。如果你的问题不好,不要惩罚人民回答这个问题的人。在这个answe中,你没有意识到即使是最原始的问题也有两个输入文件,很抱歉你没有把问题读到最后。SED的想法完全正确,但我觉得AWK在这里是更简单的解决方案,因为它可以按列工作-我首先在一个小案例中使用SED,但在一个大案例中,我觉得它太简单了重复,+1是一个很好的尝试!标题和标签都暗示sed是可以接受的。哦,好吧。当然这就是为什么+1,但我觉得awk可以更容易地做到这一点,$awk-f t'{index=$1 replace=$2}'END'{subreplace,index}'replace.txt-我需要以某种方式将另一个文件读取到缓冲区,以将内容存储到变量中,然后替换$val、$ind、newfile-尝试以最简单的方式处理事情的良好培训:+1…感谢您的支持,并且仍然提供了这个问题的答案…您需要使sed脚本更智能一些,以避免出现错误明·费拉滕,等等,当然,除非那是你想要的行为。
s/1/one/g
s/2/two/g
...
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
awk '{print $2, $2}' file
awk '{print $2, $1}' file
1 one
2 two 
3 three
four fyra
five fem
s/1/one/g
s/2/two/g
s/3/three/g
s/four/fyra/g
s/five/fem/g
sed 's%.*%s/&/g%;s% %/%' ReplaceLeftWithRight_where_you_do_not_replace_things.txt
sed 's%.*%s/&/%;s% %/%' ReplaceLeftWithRight_where_you_do_not_replace_things.txt |
sed -f - someFile_Where_You_Replace_Things.txt
$ 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