2015-03-17 2 views
3

Я искал функциональность замены файлов, которая должна быть выполнена в awk. У меня было решение, которое хорошо работало для Red Hat Linux, но с SunOS 5.10 оно плохо работает. Было бы здорово, если бы кто-то помог устранить проблему.awk скрипт не работает должным образом в SunOS (который хорошо работал с Red Hat)

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

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

Reference файл (ref.txt)

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

Обязательный выходной файл (tgt.txt)

Целевой файл должен быть обновленным исходным файлом на основе поиска значения из эталонного файла следующим образом:

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

Код

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 > tgt.txt 

Решение код дал один из наших друзей здесь в Stack Overflow, и она работала очень хорошо в Red Hat Linux.

Когда я попытался скопировать его в SunOS 5.10, он первым показал ошибку синтаксиса в:

!/=/ { 

Я заменил значение разделителя поля и он перестал показывать ошибку синтаксиса.

OFS="=" 

Для этого скрипт выполняет, но просто печатает значения исходного файла (а не обновленное значение).

Помогите найти решение этой проблемы?

+0

Вы должны быть в состоянии заменить '/ = /' с '$ 0 ~/= /'!. Вы напечатали то, что производит первый раздел кода - значения в b [1], b [2], b [3]? Вы напечатали согласованные значения в последнем разделе ($ 1, $ 2)? –

+1

Обратите внимание, что Solaris 10 имеет 'nawk' и' awk', которые имеют меньшее количество функций, чем GNU Awk. Вы можете попытаться использовать 'gawk', но он доступен только во внешних пакетах: http://www.opencsw.org/package/gawk/ – myaut

+0

@JonathanLeffler - Tried" .... $ 0! ~/= /. ... ".. Не работает ... Синтаксическая ошибка ушла ... но функциональность не работает ..... :-( –

ответ

3

Используйте nawk (новый awk) или /usr/xpg4/bin/awk (POSIX awk) с Solaris. awk - оригинальная версия устаревшей версии.

Вот то, что работает:

nawk -F= ' 
FNR==NR { 
split($0,b,",") 
a[b[1] FS b[2]]=b[3] 
next} 
$0 !~ "=" { 
f=$1 
print 
next} 
{ 
print $1"="(a[f FS $1]?a[f FS $1]:$2)} 
' ref.txt src.txt > tgt1.txt 
+0

получил это ... Спасибо! :-) –

+0

сделал U отредактировал ваше сообщение ??? Я думал, что предыдущее решение, которое вы предоставили, работало для меня ..... –

+0

Жаль, что я действительно прав. Я собираюсь проверить реальный экземпляр Solaris 10. Будет обновлено позже. – jlliagre

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

  • Нет связанных вопросов^_^