Unix Awk массив не печатает значения - PullRequest
0 голосов
/ 14 июня 2011

Это точный код, который я запускаю в моей системе с sh lookup.sh. Я не вижу никаких деталей в блоке nawk, напечатанном или записанном в файл abc.txt Только I am here 0 и I am here 1 печатаются. Даже printf в nawk не работает. Пожалуйста, помогите.

processbody() {
nawk '
NR == FNR {
split($0, x, "@")
country_code[x[2]] = x[1]
next
system(" echo " I am here ">>/tmp/abc.txt") 
}
{
CITIZEN_COUNTRY_NAME = "INDIA"
system(" echo " I am here 1">>/tmp/abc.txt") 
if (CITIZEN_COUNTRY_NAME in country_code) {
value = country_code[CITIZEN_COUNTRY_NAME]
system(" echo " I am here 2">>/tmp/abc.txt") 
} else {
value = "null"
system(" echo " I am here 3">>/tmp/abc.txt") 
}
system(" echo " I am here 4">>/tmp/abc.txt") 
print "found " value " for country name " CITIZEN_COUNTRY_NAME  >> "/tmp/standalone.txt"
} ' /tmp/country_codes.config
echo "I am here 5" >> /tmp/abc.txt
}

# Main program starts here
echo "I am here 0" >> /tmp/abc.txt
processbody 

И мой country_codes.config файл:

$ cat country_codes.config
IND@INDIA
IND@INDIB
USA@USA
CAN@CANADA

Ответы [ 3 ]

1 голос
/ 14 июня 2011

Это довольно интересный awk код.Проблема в том, что ваше первое условие, NR == FNR, активно для каждой записи, считываемой из первого файла - файла country_codes.config, но действие обработки содержит next, поэтому после того, как он прочитает запись, разделит ее и сохранитон идет и читает следующую запись, не выполняя второй блок скрипта awk.В конце это сделано - больше ничего не нужно делать, поэтому он никогда ничего не печатает.

Это работает разумно:

processbody() 
{   
    awk '
        {
        split($0, x, "@")
        country_code[x[2]] = x[1]
        #next
        }
    END {
        CITIZEN_COUNTRY_NAME = "INDIA"
        if (CITIZEN_COUNTRY_NAME in country_code) {
            value = country_code[CITIZEN_COUNTRY_NAME]
        } else {
            value = "null"
        }
        print "found " value " for country name " CITIZEN_COUNTRY_NAME
    } ' /tmp/country_codes.config
}   

# Main program starts here
processbody

Это производит вывод:

found IND for country name INDIA

Как отмечает Hai Vu , вы можете использовать встроенные средства разделения записей awk, чтобы упростить жизнь:

processbody()
{
    awk -F@ '
    { country_code[$2] = $1 }
    END {
        CITIZEN_COUNTRY_NAME = "INDIA"
        if (CITIZEN_COUNTRY_NAME in country_code) {
            value = country_code[CITIZEN_COUNTRY_NAME]
        } else {
            value = "null"
        }
        print "found " value " for country name " CITIZEN_COUNTRY_NAME
    } ' /tmp/country_codes.config
}

# Main program starts here
processbody
0 голосов
/ 14 июня 2011

@ user549432 Я думаю, что вам нужен один сценарий awk, который сначала читает файл кодов стран и создает ассоциативный массив, а затем читает входные файлы (без @ delimited) и выполняет подстановку?

если это так, давайте предположим, что /tmp/country_codes.config имеет:

IND@INDIA
IND@INDIB
USA@USA
CAN@CANADA

и / tmp / input_file (без @ delimited) имеют:

I am from INDIA
I am from INDIB
I am from CANADA

Тогда у нас может быть скрипт nawk, подобный этому:

nawk '

BEGIN {
        while (getline < "/tmp/country_codes.config")
        {
          split($0,x,"@")
          country_code[x[2]] = x[1]
        }
      }

  { print $1,$2,$3,country_code[$4]}

' /tmp/input_file

Вывод будет:

I am from IND
I am from IND
I am from CAN
0 голосов
/ 14 июня 2011

Я не знаю, чего вы хотите достичь, но позвольте мне угадать: если страна ИНДИЯ, выведите следующий вывод:

found IND for country name INDIA

Если это так, следующий код выполнитэта цель:

awk -F@ '/INDIA/ {print "found " $1 " for country name " $2 }' /tmp/country_codes.config 

Флаг -F @ указывает awk (или nawk) использовать @ в качестве разделителя полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...