2011-06-14 62 views
0

这是我在我的系统中运行的确切代码sh lookup.sh。我在nawk块中看不到任何详细信息,或者将其写入文件abc.txt。只打印I am here 0I am here 1。即使nawk中的printf不起作用。请帮忙。Unix Awk阵列不打印值

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 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
+0

你想完成什么? – 2011-06-14 04:00:49

+0

请提供示例'/ tmp/abs.txt'文件以及必需的输出。这肯定有一个简单的awk解决方案。 – ripat 2011-06-14 07:20:52

回答

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 

它产生的输出:

由于Hai Vu笔记,你可以使用awk的内在纪录分割设施,以简化生活:

processbody() 
{ 
    awk [email protected] ' 
    { 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

这样做的工作 - 我想有数组填充在awk中使用outid ethis awk(实际上在另一个nawk读取20,000个记录在一个文件中,其值为INDIA作为其中一个属性 - 我很抱歉,我不能让你知道文件的完整布局 - 简而言之,过程体应该有上面提到的awk块,并且已经填充了数组与国家名称和ISO值,我会用我的实际nawk这个数组替代国家ISO的国家名称 - 谢谢 – user549432 2011-06-14 15:19:42

+0

@ user548432:在你的'awk'手册中查找'getline'。至少在'gawk'(GNU Awk)中,你可以使用BEGIN块中的'getline来预加载你的数组。如果你的版本不能通过某种机制来实现,那么考虑升级到GNU Awk或者改用Perl或Python来完成这项工作。你不能让一个awk脚本填充另一个awk脚本。或者,您也许可以使用FILENAME变量来检测何时读取配置文件以及何时读取其他内容,然后在命令行中指定配置文件和其他数据文件。 – 2011-06-14 17:07:18

0

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

如果是这样,下面的代码将实现该目标:

awk [email protected] '/INDIA/ {print "found " $1 " for country name " $2 }' /tmp/country_codes.config 

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

+0

我已经有一个nawk块,它读取一个20000条记录的文件,其中一个字段是国家,我想要一个小块用于ISO代码查找 - 我想将它放在一个单独的数组中,然后在nawk块中使用它每当我得到国家 - 希望这可以帮助 – user549432 2011-06-14 04:24:53

+0

@ user549432你可以提供两个文件的样本以及所需的输出。没有这个,我们只能猜测你在做什么。 – ripat 2011-06-14 10:12:11

+0

@ Ripat - 乔纳森在上面发布的代码完成了这项工作 - 对于你的问题 - 我希望在awk中使用国家名称和ISO填充数组,以便在awk之外使用(实际上在另一个nawk中,它可以读取文件中的20,000条记录,它有一个值INDIA作为属性之一 - 我很抱歉,我不能让你知道文件的完整布局 - 简而言之,过程体应该具有上面提到的awk块,并使用国家名和ISO值填充数组我将在我的实际nawk中使用这个数组来代替国家ISO的国家名称 - 谢谢 – user549432 2011-06-14 15:28:06

0

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

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

[email protected] 
[email protected] 
[email protected] 
[email protected] 

和/ 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 
+0

是你要求的要求是正确的 - 非常感谢你的时间 - 上述代码的问题是数组是建立在nawk块 - 这个pice运行输入文件中的每个记录和getline/grep会慢在输入文件中每处理20 K条记录 - 我已经有getline的工作解决方案 - 我希望这个关联数组在我现有的nawk之外 - 构建一个数组,然后使用该数组来查找我的国家nawk块 – user549432 2011-06-14 16:54:50

+0

我把getline构建了BEGIN {}块中的关联数组。在处理所有输入之前,BEGIN {}块只运行一次。所以它只会构建一次关联数组。 – 2011-06-14 19:07:08

+0

@ Praveen什么是Country_code [$ 4] - 在开始区块后,假设我在COUNTRY_NAME字段中获得值India - 我可以在Country_code数组列表中执行COUNTRY_NAME之类的操作吗? – user549432 2011-06-15 01:44:16