2015-09-23 8 views
-1

Я пытаюсь написать скрипт, который заменит каждое слово файла другим соответствующим словом в соответствии с файлом списка.Bash: заменить слово другим словом из списка

phylofile (файл должен быть изменен) является:

(((swallowtail,noctuid):90,pyraloid):74,crambine) 

namefile (список отображений из старых к новым прописью) является:

crambine orocrambus 
swallowtail papilio 
noctuid catocala 

Вывод должен быть:

(((papilio,catocala):90,pyraloid):74,orocrambus) 

Надеюсь, что более ясно, что

Я написал следующий сценарий:

echo -n "Enter the path to the file where names should be changed: " 
read phylofile 
echo -n "Enter the path to the file containing the string searched and the replacing string: " 
read namefile 

while read var 
do 
    searchstring=`echo "$var"|awk -F= '{print $1}'` 
    replacestring=`echo "$var"|awk -F= '{print $2}'` 
    sed "s/$searchstring/$replacestring/g" $phylofile > outputfile 
done < $namefile 

Я получаю сообщение об ошибке (французский) означает не регулярное выражение в SED команды.

я был бы очень благодарен, если вы могли бы помочь

+1

Пожалуйста, обратите внимание на [редактирование-помощь] (Http: // StackOverflow .com/редактирование-помощь). – Cyrus

+0

Действительно, Кир прав. Вы должны узнать, как использовать исходный код формата в поле вопроса. Однако вы новичок, я сделал это на этот раз для вас. Вернемся к проблеме, вы можете посмотреть здесь: http://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed – hek2mgl

+0

вы можете делать все в sed, зачем использовать awk? – tinySandy

ответ

0

Что-то, как это все, что вам нужно:

echo -n "Enter the path to the file where names should be changed: " 
read phylofile 
echo -n "Enter the path to the file containing the string searched and the replacing string: " 
read namefile 

awk ' 
NR==FNR{ map["\\<"$1"\\>"]=$2; next } 
{ 
    for (old in map) { 
     new = map[old] 
     gsub(old,new) 
    } 
    print 
} 
' "$namefile" "$phylofile" 

, но это трудно точно сказать, что вам нужно без какого-либо ввода образца и ожидаемого результата.

Выше используется GNU awk для границ слов.

Учитывая ваши вновь размещены образцы входных файлов:

$ cat namefile 
crambine orocrambus 
swallowtail papilio 
noctuid catocala 

$ cat phylofile 
(((swallowtail,noctuid):90,pyraloid):74,crambine) 

Вот это сценарий AWK работает на них:

$ awk ' 
NR==FNR{ map["\\<"$1"\\>"]=$2; next } 
{ 
    for (old in map) { 
     new = map[old] 
     gsub(old,new) 
    } 
    print 
} 
' namefile phylofile 
(((papilio,catocala):90,pyraloid):74,orocrambus) 
+0

Спасибо, но этот скрипт не дает того, что мне нужно.В файле: (((ласточкин, совок): 90, pyraloid): 74, crambine) Я хочу, чтобы заменить имена следующим образом: crambine orocrambus ласточкин Papilio совки Catocala Полученный файл будет (((Papilio, catocala): 90, пиралоид): 74, orocrambus) Надеюсь, что это более ясно – jibbah

+0

ОК, и каким образом этот скрипт не «дает то, что вам нужно»? Неверный вывод, отсутствие вывода, дамп ядра, сообщение об ошибке, что-то еще? Не пытайтесь помещать форматированный текст в комментарии, редактируйте свой вопрос, включая репрезентативный ввод (содержимое файла имен и phylofile) и ожидаемый результат. –

+0

сценарий работает (нет сообщения об ошибке), но он не возвращает никакого вывода. – jibbah

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