这是我在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
答案 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