Unix Awk数组没有打印值

时间:2011-06-14 03:16:56

标签: arrays unix printing awk

这是我在sh lookup.sh系统中运行的确切代码。我在nawk块中看不到打印或写入文件abc.txt的任何详细信息。仅打印I am here 0I 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 个答案:

答案 0 :(得分:1)

这是一些非常有趣的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

答案 1 :(得分:0)

我不知道你想要完成什么,但让我猜一下:如果国家是印度,那么打印以下输出:

found IND for country name INDIA

如果是这种情况,以下代码将实现该目标:

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

-F @ flag告诉awk(或nawk)使用@作为字段分隔符。

答案 2 :(得分:0)

@ user549432我想你想要一个awk脚本首先读入国家代码文件并构建关联数组,然后读入输入文件(不是@分隔符)并进行替换?

如果是这样,我们假设/tmp/country_codes.config有:

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

和/ tmp / input_file(不是@分隔符)有:

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