当我运行我的脚本时....
#!/bin/sh
input1=$1
input2=$2
awk -v FILEIN=$(echo $input1) '
NR==FNR {
a[$1]=$2;
next
} {
if ($19 < $20)
print $0, substr(a[FILEIN],$19,$5) ;
else print $0, substr(a[FILEIN],$20,$5)}' $input2 $input1
运行
sh script.sh 030-031 lookup.txt
有时我收到错误:&#34; script.sh:fork:retry:资源暂时不可用&#34;
如果我避免传递shell变量并显式声明FILEIN(这是不切实际的)......
#!/bin/sh
input1=$1
input2=$2
awk '
NR==FNR {
a[$1]=$2;
next
} {
if ($19 < $20)
print $0, substr(a["030-031"],$19,$5) ;
else print $0, substr(a["030-031"],$20,$5)}' $input2 $input1
..脚本有效。我无法通过使用ARGV [1]来代替显式声明变量来解决这个问题,我认为因为awk不会扩展$ input1。
我做错了什么?
答案 0 :(得分:0)
这与awk无关。你的SHELL报告了一个错误:
script.sh: fork: retry: Resource temporarily unavailable
可能是你的shell不支持$(..)
执行命令,或者在echo
参数中使用不带引号的变量导致问题,或者你的echo
是破碎或别的什么。
但它不是与awk或-v
有关,除了你使用你的shell不喜欢的shell命令填充awk变量这一事实。< / p>
尝试其中任何一种:
awk -v FILEIN=$(echo "$input1") '...'
awk -v FILEIN=`echo "$input1"` '...'
awk -v FILEIN="$input1" '...'
看看哪些有用。我最好能说出最后一个应该是你所需要的一切。
哦,永远不要像其他人建议的那样使用双引号来分隔awk脚本。这只会导致各种引用和转义问题,以及给出一些shell变量值的恶梦失败和/或错误消息的可能性。
最后 - 总是引用你的shell变量,除非你有一个非常具体的结果,你试图通过让它们不加引号来实现,并完全理解所有注意事项以及对这样做的分词,通配等的含义。