awk系统未正确设置变量

awk系统未正确设置变量,awk,system,Awk,System,我在将grep(在nawk的system()中使用)的输出分配给变量时遇到了一个问题 nawk '{ CITIZEN_COUNTRY_NAME = "INDIA" CITIZENSHIP_CODE=system("grep "CITIZEN_COUNTRY_NAME " /tmp/OFAC/country_codes.config | cut -d @ -f1") }'/tmp/***** 值IND显示在控制台中,但当我打印时,citizenshipcode的值是0-你能在这里帮助我吗

我在将grep(在nawk的system()中使用)的输出分配给变量时遇到了一个问题

nawk '{
CITIZEN_COUNTRY_NAME = "INDIA"
CITIZENSHIP_CODE=system("grep "CITIZEN_COUNTRY_NAME " /tmp/OFAC/country_codes.config   | cut -d @ -f1")
 }'/tmp/*****
值IND显示在控制台中,但当我打印时,citizenshipcode的值是0-你能在这里帮助我吗

printf(“国家标签|%s |%s\n”、公民|国家|名称、公民|代码)

country_codes.config文件的内容

IND@INDIA
IND@INDIB
CAN@CANADA

系统返回被调用命令的退出值,但命令的输出不会返回到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 ); }' awk'{ 文件=“/tmp/OFAC/country_codes.config”; 公民\国家\名称=“印度”; FS=“@”; while(getline使用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

从awk调用系统是性能杀手,因为它将在awk读取的每一行上被调用。我只能猜测您正在尝试做什么,但awk肯定可以同时处理两个(或更多)文件。你能提供更多的细节吗?示例输入文件和所需输出?我已经有一个nawk块,它可以读取一个包含20000条记录的文件,其中一个字段是country,我想要一个用于ISO代码查找的小块-我想将它放在一个单独的数组中,然后在我得到country时在nawk块中使用它-希望这有助于感谢您的帮助。这正是我一直在寻找的,它工作得非常完美-真的非常感谢-我还有一个问题。我还有一个问题,国家查询文件将有大约260条记录,大约有20000条输入记录,因此,根据该代码,20 K记录的数据将被读取260行-这可以吗,或者我们可以使用grep命令重写此文件-请告知-感谢热线可能与使用grep一样慢。在查找文件中搜索每条记录可能是个坏主意。但是awk对这类事情是有好处的;读取国家查找一次并构建一个数组,然后从数组中读取输入记录和输出数据CIV@COTE科特迪瓦COD@CONGO,扎伊尔民主共和国)你能帮我克服这两个问题吗?问题是什么?如果您可以简化代码以检测问题的根源,您可能会找到解决方案。(括号和单引号应该不是问题,在我尝试过的简单案例中,我没有发现任何问题。)非常感谢您的帮助。这正是我一直在寻找的,它工作得非常完美-真的非常感谢-我还有一个问题。我还有一个问题,国家查询文件将有大约260条记录,大约有20000条输入记录,因此,根据该代码,20 K记录的数据将被读取260行-这可以吗,或者我们可以使用grep命令重写此数据-请使用此awk代码,您读取260条记录一次,对于每个20K的输入记录,你只需要做一个非常快速的数组查找。否则,您对每个输入记录执行grep(20000个grep进程),显然效率要低得多。我尝试通过调用main表单并使用一些echo来调用这个nawk块-内部使用的系统echo都没有打印出来,您能在这里帮助我吗-查看在我的原始文档中编辑的代码的详细信息question@user549432,我不明白你的评论。请发一些代码。还有“系统回声”?为什么不直接打印?@Glen-请找到链接——谢谢你的帮助