【问题标题】:Replacement by dictionary possible with AWK or Sed? [closed]可以用 AWK 或 Sed 替换字典吗? [关闭]
【发布时间】:2013-09-07 03:50:26
【问题描述】:

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

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


示例

字典.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

专门选择替换但一对一替换不起作用的 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

【问题讨论】:

    标签: dictionary awk sed substitution


    【解决方案1】:
    $ 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】:

      如果你有 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
      

      【讨论】:

      • @hhh,另一个文件也是基于列的吗?我不知道你真正的“replaceRuleFile”是什么样子的。如果有*,.,+[.....这样的字符,使用正则表达式替换是不可靠的。
      • +1 以对抗 OP 的肆意投反对票。如果你的问题不好,不要惩罚回答问题的人。
      • +1 表示我的耐心...
      • +1 当因为赞成类似的答案而改变时——即使这个答案忽略了关于多个输入文件的观点,这是我在第一次编辑时就有的。
      【解决方案3】:

      编辑

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

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

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

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

      如果要先翻转第二列:

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

      【讨论】:

      • 是的,我这样做是因为我关注了您的原始帖子,然后您进行了编辑...这不能回答已编辑的问题...
      • 抱歉,但这不是我想要的——我最初的问题拼写错误——现在应该清楚 -1 直到更正。
      • +1 以对抗 OP 的肆意投反对票。如果你的问题不好,不要惩罚回答问题的人。
      • 在这个答案中你没有意识到即使是最原始的问题也有两个输入文件,很抱歉你没有把问题读到最后。
      【解决方案4】:

      如果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 上应该可以工作。

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

      【讨论】:

      • SED 的想法是完全正确的,但我觉得 AWK 在这里是更简单的解决方案,因为它按列工作——我首先在一个小案例上使用 SED,但对于一个大案例,我觉得它太重复了, +1 祝您好运!
      • 标题和标签都暗示sed 是可以接受的。哦,好吧。
      • 当然这就是 +1 的原因,但我觉得 awk 可以更轻松地做到这一点,$ awk -f t '{index=$1 replace=$2}' END '{sub(replace,index) }' replace.txt - 我需要以某种方式读取另一个文件以缓冲以将内容存储到变量然后替换($val , $ind, newfile) -- 尝试以最简单的方式做事的良好训练:)
      • +1 ...感谢您的支持,并且仍然提供此问题的答案...
      • 您需要使 sed 脚本更智能一些,以避免“十四”变成“fyrateen”等,除非这是所期望的行为。
      猜你喜欢
      • 2010-10-27
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2017-11-11
      • 2017-02-08
      相关资源
      最近更新 更多