Нужно предложение для следования. Есть два файла myfile и responsefile.

Первый файл

myfile.txt  

user=myname   
user_1=yourname   
group=mygroup   
group_1=yourgroup

второй файл

responsefile.txt

#Please fill details  
user=  
#user_1=  
#user_2=  

#Please fill details  
group=  
#group_1=  
#group_2=  

На основе myfile.txt обновите данные responsefile.txt, как показано ниже, и файл responsefile.txt имеет длину около 604L, 16481C.

Вывод результата

responsefile.txt

#Please fill details  
user=myname  
user_1=yourname  
#user_2=  

#Please fill details  
group=mygroup  
group_1=yourgroup  
#group_2=  

Если вы видите myfile выше, я хочу сопоставить user = в responsefile, затем обновить как user = myname, то же самое относится и к group =. Затем сопоставьте user_1 = и group_1 =, которые хэшированы или прокомментированы в файле ответов, обновите как user_1 = ваше имя и group_1 = ваша группа. Не должен удалять хеш или раскомментировать для других в файле.

Я пробовал это

awk -F= 'NR==FNR{a[$1]=$0;next}$1 in a{$0=a[$1]}1' myfile.txt responsefile.txt

Пожалуйста, предложите спасибо заранее.

1 ответ1

0

Вот скрипт shell + sed, который выберет имена и значения переменных (перед циклом), а затем отредактирует их в файл (за несколько проходов внутри цикла):

#!/bin/sh

sed -nr 's/^([^=#][^=]*)=(.*)$/\1\n\2/p' "$1" |
    while read var ; read val ; do
        sed -ri "s/^#?($var=) *$/\1$val/" "$2"
    done

Первым параметром скрипта является файл со значениями (myfile.txt). Второй файл для заполнения (responsefile.txt). Второй файл редактируется на месте. Скрипт не обрабатывает пробелы специально (кроме пробелов после = в responsefile.txt), так как в вопросе не было ясно, как это должно быть.

Вот расширение вашего скрипта AWK, завершенное, чтобы быть функциональным во всех случаях, представленных в ваших демонстрационных файлах. Сначала он заполнит ассоциативный массив из первого файла, затем изменит содержимое второго файла и отправит его на стандартный stdout . Я не представляю его как однострочник, чтобы он был читабельным:

#!/usr/bin/awk -f

BEGIN   { FS="=" }
NR==FNR { a[$1]=$0; next }
$1 in a { $0=a[$1] }
/^#/    { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }
1

Ваш сценарий просто нуждался в специальной обработке для заданий с комментариями. Параметры сценария такие же, как в первом сценарии, но выходные данные отправляются на стандартный stdout а второй файл остается неизменным.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .