2015-03-12 7 views
0

Это продолжение моей предыдущей должности string replacement using awk command, который не 100% полностью решен .. Для того, чтобы было понятнее ..замена строки команду, используя AWK

(исходный файл и код, я использую находятся в нижней части пост)

требование 1

Если у меня нет, если поиск данных (например, для «u_no» не в справочном файле, текущее решение выводит пустое поле.

aaaa 
uid=1a1a 
pwd=1b1b 
u_no= 

Я хочу, чтобы выбрать значение из исходного файла, а не ..

aaaa 
uid=1a1a 
pwd=1b1b 
u_no=12345 

требование 2

Если данные в исходном файле или отпечатком замешан, он должен еще сделайте замену должным образом.

То есть, когда файл исх изменяется следующим образом:

block,parameter,value 
aaaa,uid,1a1a 
aaaa,pwd,1b1b 
bbbb,uid,2a2a 
zzzz,pwd,9b9b 
zzzz,uid,9a9a 
bbbb,pwd,2b2b 

Для этого, я получаю

aaaa 
uid=1a1a 
pwd=1b1b 
u_no= 
bbbb 
uid=2a2a 
pwd=9b9b 
zzzz 
uid=9a9a 
pwd=2b2b 

** я должен получить **

aaaa 
uid=1a1a 
pwd=1b1b 
u_no=12345 #points to my req 1 
bbbb 
uid=2a2a 
pwd=2b2b 
zzzz 
uid=9a9a 
pwd=9b9b 

Я хочу, чтобы поиск и замена выполнялись на основе блоков aaaa,bbbb,zzzz,etc.. Не последовательно. (Например, здесь значение pwd для bbbb должно быть 2b2b, а не 9b9b).

исходный файл (src.txt)

aaaa 
uid=xxxx 
pwd=nnnn 
u_no=12345 
bbbb 
uid=yyyy 
pwd=eeee 
zzzz 
uid=yyyy 
pwd=eeee 

Примечание uid и pwd значение bbbb такое же, как и в zzzzsrc файле.

ссылка на файл (ref.txt)

block,parameter,value 
aaaa,uid,1a1a 
aaaa,pwd,1b1b 
bbbb,uid,2a2a 
zzzz,pwd,9b9b 
zzzz,uid,9a9a 
bbbb,pwd,2b2b 

Примечание: Порядок записей в файле реф может также изменить, как я упоминалось в требовании 2. Значение для поиска uid и pwd для bbbb является отличается от zzzz. Но мне нужен результат следующим образом: -

Требуемый файл вывода (src_out.TXT) (в том числе требования 1 и 2)

aaaa 
uid=1a1a 
pwd=1b1b 
u_no=12345 
bbbb 
uid=2a2a 
pwd=2b2b 
zzzz 
uid=9a9a 
pwd=9b9b 

Код

$ cat tst.awk 
BEGIN { FS = "[,=]+" } 
NR==FNR { 
    if (NR>1) { 
     map[$1,$2] = $3 
    } 
    next 
} 
{ 
    if (NF==1) { 
     key = $0 
    } 
    else { 
     $0 = $1 "=" map[key,tolower($1)] 
    } 
    print 
} 

$ awk -f tst.awk ref.txt src.txt 

Это прекрасно работает для моего первоначального ожидания, но requirement 1 и requirement 2, которые я указал здесь теперь добавлены и я нужно решение для них.

+0

Что вы пытались решить эту проблему? – Jotne

+1

Измените свой вопрос, чтобы сделать его более ясным и более ясным, в чем разница между этим и вашими предыдущими вопросами (http://stackoverflow.com/q/28963149/1745001 и http://stackoverflow.com/q/28849774/1745001), так как я вообще не вижу никакой разницы, а также расскажу, каким образом предыдущее решение (http://stackoverflow.com/a/28965212/1745001) не работает для ваших новых требований (независимо от того, что они есть) - показать результат, который он производит для сравнения с желаемым выводом. Вам нужно приложить больше усилий и усилий, чтобы задать вопрос, чтобы мы могли вам помочь. –

+0

Возможный дубликат [Поиск заменить строку в файле на основе столбца в другом файле] (http://stackoverflow.com/questions/20327179/search-replace-string-in-a-file-based-on-column-in -other-file) – NeronLeVelu

ответ

0

Вот одно решение с awk

awk -F= ' 
FNR==NR { 
    split($0,b,",") 
    a[b[1] FS b[2]]=b[3] 
    next} 
!/=/ { 
    f=$1 
    print 
    next} 
    { 
    print $1"="(a[f FS $1]?a[f FS $1]:$2)} 
' ref.txt src.txt 
aaaa 
uid=1a1a 
pwd=1b1b 
u_no=12345 
bbbb 
uid=2a2a 
pwd=2b2b 
zzzz 
uid=9a9a 
pwd=9b9b 
+0

проверит и сообщит вам, сэр ... спасибо! :) – Sanish

+0

Он отлично работает ... Если в случае необходимости отправки параметров в программу AWK .. как отправить сюда? ... здесь я хочу взять 3-й столбец или 4-й столбец или 5-й столбец из ссылочного файла на основе определенных условий .... так что ключ станет либо ... a [b [1] FS b [2]] = b [3] ..... или .... a [b [1] FS b [2]] = b [4] ..... или ..... a [b [1] FS b [2]] = b [5] ... при чтении файла ссылки .... как параметризовать это b [...] ... ??? – Sanish

+0

@ Исландский Читайте мой ответ о том, как получить данные в гостиницу 'awk' здесь: http://stackoverflow.com/questions/19075671/how-to-use-shell-variables-in-awk-script – Jotne

0

переделаны, чтобы проверить на наличие значений Src в файле исх:

$ cat tst.awk 
BEGIN { FS = "[,=]+" } 
NR==FNR { 
    if (NR>1) { 
     map[$1,$2] = $3 
    } 
    next 
} 
{ 
    if (NF==1) { 
     key = $0 
    } 
    else if ((key,tolower($1)) in map) { 
     $0 = $1 "=" map[key,tolower($1)] 
    } 
    print 
} 

$ awk -f tst.awk ref.txt src.txt 
aaaa 
uid=1a1a 
pwd=1b1b 
u_no=12345 
bbbb 
uid=2a2a 
pwd=2b2b 
zzzz 
uid=9a9a 
pwd=9b9b 
+0

Будет проверять и сообщать вам об этом сэр ... Спасибо! :) – Sanish

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