【问题标题】:Using awk, how to replace one string with another?使用 awk,如何用另一个字符串替换一个字符串?
【发布时间】:2017-01-05 20:35:37
【问题描述】:

需要创建一个awk 脚本来将glyph (https://en.wikipedia.org/wiki/Glyph) 转换为UnicodeJavaScript 语法),反之亦然 - Unicode 转换为字形。

源数据以UTF-8 编码存储在NotePad++ 中。

这是我的进度。

Use_case_1

字典文件 (dict_1_.txt):

A \u0041
À \u00C0

输入文件 (input_1_.txt):

A
À

awk 为等效字形生成 Unicode 的脚本:

awk 'NR == FNR { a[$1] = $2; next } $1 in a { $1 = a[$1] } $2 in a { $2 = a[$2] } 1' dict_1_.txt input_1_.txt

正确生产:

\u0041
\u00C0

Use_case_2

字典文件 (dict_2_.txt)

\u0041 A
\u00C0 À

输入文件 (input_2_.txt)

\u0041
\u00C0

awk 用于为等效 Unicode 生成字形的脚本:

awk 'NR == FNR { a[$1] = $2; next } $1 in a { $1 = a[$1] } $2 in a { $2 = a[$2] } 1' dict_2.txt input_2.txt

正确生产:

A
À

因此,可以在单个符号上成功“往返”。

但是如何处理更全面的字典和每行一个以上的单词呢?

这是示例数据。

输入文件 (input_3_.txt)

PUDÍN, ALMIDÓN

字典文件 (dict_3_.txt)

,   \u002C
A   \u0041
D   \u0044
I   \u0049
Í   \u00CD
L   \u004C
M   \u004D
N   \u006E
Ó   \u00D3
P   \u0050
U   \u0055
<space> \u0020

awk 脚本应该生成:

\u0050\u0055\u0044\u00CD\u006E\u002C\u002C\u0041\u004C\u004D\u0049\u0044\u00D3\u006E

输入文件 (input_4_.txt)

\u0050\u0055\u0044\u00CD\u006E\u002C\u002C\u0041\u004C\u004D\u0049\u0044\u00D3\u006E

字典文件 (dict_4_.txt)

\u002C  ,
\u0041  A
\u0044  D
\u0049  I
\u00CD  Í
\u004C  L
\u004D  M
\u006E  N
\u00D3  Ó
\u0050  P
\u0055  U
\u0020  <space>

awk 脚本应该生成:

PUDÍN, ALMIDÓN

这是一组更复杂的输入字符串(每行一个):

MONO Y DIACETIL ÉSTERES DEL ÁCIDO TARTÁRICO DE MONO Y DIGLICÉRIDOS DE ÁCIDOS GRASOS AÑADIDOS
043 HUEVAS DE PESCADO (INCLUYENDO ESPERMA=HUEVAS BLANDAS) Y VÍSCERAS COMESTIBLES DE PESCADO
ACEITE DE SOJA OXIDADO TÉRMICAMENTE Y EN INTERACCIÓN CON MONO Y DIGLICÉRIDOS DE ÁCIDOS GRASOS
BANDEJA PLÁSTICA O CAZUELA, CUBIERTA DE PAPEL DE ALUMINIO O ENVOLTURA

在上面的字典示例中,使用&lt;space&gt; 表示单词之间和逗号后的“符号”。这可能意味着解决方案应该在 Dictionary 文件和 Input 文件中使用 \t 代替 FS。目前FS 是键盘“空格”。 RS 也是 \n

此外,我需要对十六进制执行相同的操作,因此解决方案需要像这样处理字典文件:

Í   &#xcd;
Ó   &#xd3;

与上面的字典示例相比:

Í   \u00CD
Ó   \u00D3

如何用处理多行较长字符串的脚本改进或替换我的简单 awk 脚本?

【问题讨论】:

  • 哇。这个问题太长了。缩短它怎么样?
  • 问题是:How to improve or replace my simple awk scripts with scripts that process the longer strings on multiple lines?。文本显示了进展 (MCV) 和希望可以由提议的解决方案处理的数据。

标签: awk gawk


【解决方案1】:

这是一种方法,请注意您不需要两个不同版本的字典。

不费吹灰之力就可以将这两个组合成一个脚本,并且可以通过参数控制从/到转换。我故意保持字典部分不变

$ awk 'NR==FNR {$2=$2?$2:" "; u2a[$1]=$2; a2u[$2]=$1; next}
               {for(i=1;i<=NF;i++) $i=a2u[$i]}1' dict FS='' OFS='' input

\u0050\u0055\u0044\u00CD\u006E\u002C\u0020\u0041\u004C\u004D\u0049\u0044\u00D3\u006E

现在处理编码输入

$ awk 'NR==FNR {$2=$2?$2:" "; u2a[$1]=$2; a2u[$2]=$1; next}
               {enc=$0; gsub(/....../,"& ",enc); n=split(enc,a);
                for(i=1;i<=n;i++) line=line u2a[a[i]]; print line}' dict encoded_input

PUDÍN, ALMIDÓN

使用您的 dict_4 作为两个脚本的字典

【讨论】:

  • 文本中的“dict”有问题。那应该是'dict_4_.txt吗?
  • 这是一件美好的事情。我可以复制你的建议。当然,西班牙字形在我的 BASH 中无法正确呈现,但在写入 output.txt 并以 NotePad++ 打开时会正确呈现。给我一个小时来测试更长的字符串。
  • @Jay Gray。抱歉,仅此而已。
  • 好的 - 让我想想如何最好地做到这一点。可以修剪最初的问题,替换您的建议并添加失败的数据。也可以提交一个新问题,包括最新进展。你有偏好吗?
猜你喜欢
  • 2013-12-03
  • 2019-05-14
  • 1970-01-01
  • 2011-04-06
  • 2017-01-28
  • 2017-03-07
  • 1970-01-01
  • 2021-06-15
相关资源
最近更新 更多