2017-01-05 2 views
0

Необходимо создать сценарий awk для преобразования glyph (https://en.wikipedia.org/wiki/Glyph) в Unicode (JavaScript синтаксис), а обратный - в Юникод к глифу.Использование awk, как заменить одну строку на другую?

Исходные данные хранятся в NotePad++ с кодировкой UTF-8.

Вот мой прогресс.

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>, чтобы указать ' символ "между словами и после запятой. Вероятно, это означает, что решение должно использовать \t для FS как в файле словаря, так и в файле ввода. В настоящее время FS является «пространством клавиатуры». Также RS - \n.

Кроме того, мне нужно сделать то же самое для шестнадцатеричного, поэтому решение нужно обработать файл словаря, как это:

Í &#xcd; 
Ó &#xd3; 

по сравнению с Dictionary примере выше:

Í \u00CD 
Ó \u00D3 

Как улучшить или заменить мои простые сценарии awk скриптами, которые обрабатывают более длинные строки на нескольких строках?

+1

вау. этот вопрос слишком длинный. Как насчет сокращения? – NinjaGaiden

+0

Вопрос: 'Как улучшить или заменить мои простые скрипты awk скриптами, которые обрабатывают более длинные строки на нескольких строках?'. Текст показывает прогресс (MCV) и данные, которые, надеюсь, могут быть обработаны предлагаемым решением. –

ответ

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 в качестве словаря для обоих сценариев

+0

Проблема с «dict» в тексте. Должно ли это быть «dict_4_.txt? –

+0

Да, используйте свое собственное имя файла. – karakfa

+0

Это прекрасная вещь. Я могу воспроизвести ваше предложение. Конечно, испанские глифы не отображаются должным образом в моем BASH, но записываются в 'output.txt' и открываются с помощью« NotePad ++ ». Дайте минутку, чтобы испытать на более длинных струнах. –

Смежные вопросы