2011-06-13 39 views
0

我有一个问题,将grep的输出(用于nawk中的system())分配给一个变量。awk系统没有正确设置变量

nawk '{ 
CITIZEN_COUNTRY_NAME = "INDIA" 
CITIZENSHIP_CODE=system("grep "CITIZEN_COUNTRY_NAME " /tmp/OFAC/country_codes.config | cut -d @ -f1") 
}'/tmp/***** 

值IND显示在控制台,但是当我给一个printf citizenshipcode的值是0 - 你能请帮助我在这里

的printf(“国家标签|%S |%S \ N”,CITIZEN_COUNTRY_NAME,CITIZENSHIP_CODE)

country_codes.config文件的内容

[email protected] 
[email protected] 
[email protected] 
+0

调用从awk的系统,因为它会在每一行的读取调用的性能杀手由awk。我只能猜测你想要做什么,但awk可以同时处理两个(或更多)文件。你能提供更多细节吗?示例输入文件和所需的输出? – ripat 2011-06-13 07:47:41

+0

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

回答

1

系统返回被叫命令的退出值,但命令i的输出没有回到awk(或nawk)。要获得输出,您需要直接使用getline。例如,你可能会重新写你的脚本:

 
awk ' { 
file = "/tmp/OFAC/country_codes.config"; 
CITIZEN_COUNTRY_NAME = "INDIA"; 
FS = "@"; 
while(getline < file) { 
    if($0 ~ CITIZEN_COUNTRY_NAME) { 
     CITIZENSHIP_CODE = $1; 
    } 
} 
close(file); 
}' 
+0

非常感谢您的帮助。这正是我所期望的,它的工作原理非常好 - 真的很感谢 - 我还有一个问题。我还有一个问题,国家查找文件将有大约260条记录,并且将会有大约20,000条输入记录,所以对于20条K记录,这条代码将会有260条线被读取 - 请问这是好的还是我们可以用grep重写命令 - 请指教 - 谢谢 – user549432 2011-06-13 17:19:39

+1

getline可能会像使用grep一样慢。搜索每个记录的查找文件可能是一个坏主意。但awk对于这种事情是有好处的;读取国家查找一次并构建数组,然后读取数组中的输入记录和输出数据。 – 2011-06-13 18:22:39

+0

我面临的一个问题每当有国名(支架) 或单apostrope' 样本值 CIV @科特迪瓦 COD @刚果民主共和国(扎伊尔是) 你可以请帮我解决这两个问题。 – user549432 2011-07-18 04:07:09

0

预加载使用awk配置文件:

nawk ' 
    NR == FNR { 
    split($0, x, "@") 
    country_code[x[2]] = x[1] 
    next 
    } 
    { 
    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 
    } 
' country_codes.config filename 
+0

非常感谢您的帮助。这正是我所期望的,它的工作原理非常好 - 真的很感谢 - 我还有一个问题。我还有一个问题,国家查找文件将有大约260条记录,并且将会有大约20,000条输入记录,所以对于20条K记录,这条代码将会有260条线被读取 - 请问这是好的还是我们可以用grep重写命令 - 请指教 – user549432 2011-06-13 18:04:44

+0

使用此awk代码,您只需读取一次260条记录,并且对于每个20K输入记录,您只需进行一次非常快速的数组查找。否则,你对每个输入记录执行grep(20,000 grep进程),显然效率更低。 – 2011-06-13 18:28:23

+0

我试图通过调用主窗体并使用一些回声来关闭此nawk块 - 没有使用内部使用的系统回声,你可以在这里帮助我 - 查看我原始问题中编辑的代码的详细信息 – user549432 2011-06-13 20:15:50