2017-01-05 171 views
0

需要創建一個awk腳本以將glyphhttps://en.wikipedia.org/wiki/Glyph)轉換爲UnicodeJavaScript語法),並將Unicode轉換爲字形。使用awk,如何用另一個字符串替換一個字符串?

源數據以UTF-8編碼存儲在NotePad++中。

這是我的進步。

Use_case_1

詞典文件(dict_1_.txt):

A \u0041 
À \u00C0 

輸入文件(input_1_.txt):

A 
À 

awk腳本用於生成的Unicode等同於g lyph:

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 

在上面的解釋實施例中,已經使用<space>指示'符號'之間和逗號後。這可能意味着在Dictionary文件和輸入文件中解決方案應該使用\t代替FS。目前FS是鍵盤「空間」。 RS也是\n

此外,我需要做爲十六進制相同的,所以一個解決方案需要處理詞典文件是這樣的:相比於上述字典示例

Í &#xcd; 
Ó &#xd3; 

Í \u00CD 
Ó \u00D3 

如何改進或替換我的簡單awk腳本與處理多行更長的字符串的腳本?

+1

哇。這個問題太長了。如何縮短它? – NinjaGaiden

+0

問題是:'如何用多行處理較長字符串的腳本來改進或替換我簡單的awk腳本?'。文本顯示了進度(MCV)和希望可以通過建議的解決方案處理的數據。 –

回答

1

這裏有一種方法,請注意,你不需要兩個不同版本的字典。

只需很少的努力,這兩個可以合併爲一個腳本,並且可以使用參數控制from/to轉換。我特意讓字典部分相同

$ 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作爲字典兩個腳本

+0

在文字中出現「字典」的問題。那應該是'dict_4_.txt? –

+0

是的,使用你自己的文件名。 – karakfa

+0

這是一件美麗的事情。我可以複製你的建議。當然,西班牙字形在我的BASH中不能正確渲染,但是在寫入'output.txt'並用'NotePad ++'打開時可以。給我一個小時來測試更長的琴絃。 –

相關問題