заменить слово в текстовом файле для фонемы девнагари - PullRequest
0 голосов
/ 16 марта 2020

У меня есть два текстовых файла File_A и File_B. Файл_A содержит следующие символы:

a   अ
aa  आ
b a ब
bh a    भ
c a च
ch a    छ
d a द
dh a    ध
dx a    ड
dxh a   ढ
g a ग
gh a    घ
h a ह
j a ज
jh a    झ
k a क
kh a    ख
l a ल
m a म
n a न
nx a    ण
p a प
ph a    फ
r a र
s a स
sh a    श
t a त
th a    थ
tx a    ट
txh a   ठ
w a व
y a य
z a ज़
b   ब
bh  भ
c   च
ch  छ
d   द
dh  ध
dx  ड
dxh ढ
ee  े
ei  ै
g   ग
gh  घ
h   ह
i   ि
ii  ी
j   ज
jh  झ
k   क
kh  ख
l   ल
m   म
n   न
nx  ण
o    ो
ou   ौ
p   प
ph  फ
r   र
s   स
sh  श
t   त
th  थ
tx  ट
txh ठ
u   ु
uu  ू
w   व
y   य
z   ज़
b aa    बा
bh aa   भा
c aa    चा
ch aa   छा
d aa    दा
dh aa   धा
dx aa   डा
dxh aa  ढा
g aa    गा
gh aa   घा
h aa    हा
j aa    जा
jh aa   झा
k aa    का
kh aa   खा
l aa    ला
m aa    मा
n aa    ना
nx aa   णा
p aa    पा
ph aa   फा
r aa    रा
s aa    सा
sh aa   शा
t aa    ता
th aa   था
tx aa   टा
txh aa  ठा
w aa    वा
y aa    या
z aa    ज़ा

. Если вы видите подробности в приведенном выше файле, например, в первой строке "a अ", между каждой строкой между римской и девнагари есть вкладка. Косвенно я пытаюсь заменить до вкладки с после вкладки. Я пытаюсь заменить вышеуказанную фонему в File_B, который содержит следующее.

dx o n aa l d s

Я пробовал с помощью сценария оболочки, но получаю неправильный вывод. Вот код.

#!/bin/bash

while read p q
do
 echo "P is : " $p
 echo "Q is : " $q
 echo "-----------------"
# sleep 3
 sed -i "s/\<$p\>/$q/g" $2
done < $1

и получение результата:

a   ड ो a   न आ a   ल a द a स

Я ожидаю:

ड ो ना ल द स

Python или оболочка, оба принимаются .

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Файл "awk_script":

#! /usr/bin/env awk

BEGIN {
    counter = 0
}

{
    if (FNR == NR) {

        # Store key val pairs from first file

        key[counter] = $1
        value[counter] = $2
        counter++

    } else {

        # Replace stored key val pairs in second file

        for (i = 0 ; i < counter ; i++) {
            gsub(key[i], value[i], $0)
        }

        print
    }
}

Файл "bash_script"

#! /usr/bin/env bash

file1='File_A'
file2='File_B'
temp_file1="$( mktemp "/tmp/${file1}-XXXXX" )"
awk_script_file_name='awk_script'


#
# Create a temp file which is reverse
# sorted based on length of the keys
# and pass that temp file to awk script
#

awk -F'\t' -v OFS='~' '{

    print $1, $2, length($1)

}' "${file1}" |
    sort -r -n -t '~' -k3 > "${temp_file1}"


awk \
    -F'~' \
    -f "${awk_script_file_name}" \
    "${temp_file1}" \
    "${file2}"

rm "${temp_file1}"

PS: этот сценарий использует варианты команд BSD и может потребоваться настроить на адаптироваться к вариантам GNU.

0 голосов
/ 16 марта 2020

A perl решение на основе:

#!/usr/bin/env perl
use warnings;
use strict;
use autodie;
use feature qw/say/;
use open qw/:std :locale/;

my @mappings;
open my $file, "<:encoding(UTF-8)", $ARGV[0];
while (my $line = <$file>) {
  chomp $line;
  push @mappings, [ split /\t/, $line ];
}
close $file;

@mappings = sort { my $x = length $b->[0] <=> length $a->[0];
                   $x != 0 ? $x : $a->[0] cmp $b->[0] } @mappings;
# Precompile the regular expressions
@mappings = map { [ qr/\b$_->[0]\b/, $_->[1] ] } @mappings;

open $file, "<:encoding(UTF-8)", $ARGV[1];
while (my $line = <$file>) {
  my $output;
  chomp $line;
  for my $pair (@mappings) {
    my ($roman, $devnagari) = @$pair;
    $line =~ s/$roman/$devnagari/g;
  }
  say $line;
}

File_A и File_B передаются в командной строке соответственно:

$ perl convert.pl file_a.txt file_b.txt
ड ो ना ल द स 

Простой метод грубой глобальной подстановки не работает потому что, скажем, a является отдельной фонемой и частью многих более длинных. Если вы отсортируете список фонем так, чтобы сначала проверялись самые длинные токены (чтобы c a соответствовало до c независимо от порядка их появления в File_A), становится разумнее использовать этот подход. Вы также можете попытаться найти самую длинную возможную фонему в начале текста, вытолкнуть ее и повторять до тех пор, пока не будет использована вся входная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...