Я искал функциональность замены файлов, которая должна быть выполнена в 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 ~/= /'!. Вы напечатали то, что производит первый раздел кода - значения в b [1], b [2], b [3]? Вы напечатали согласованные значения в последнем разделе ($ 1, $ 2)? –
Обратите внимание, что Solaris 10 имеет 'nawk' и' awk', которые имеют меньшее количество функций, чем GNU Awk. Вы можете попытаться использовать 'gawk', но он доступен только во внешних пакетах: http://www.opencsw.org/package/gawk/ – myaut
@JonathanLeffler - Tried" .... $ 0! ~/= /. ... ".. Не работает ... Синтаксическая ошибка ушла ... но функциональность не работает ..... :-( –