在shell脚本中使用awk -v时出现fork重试错误

时间:2014-05-28 11:45:15

标签: bash awk sh

当我运行我的脚本时....

#!/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。

我做错了什么?

1 个答案:

答案 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变量,除非你有一个非常具体的结果,你试图通过让它们不加引号来实现,并完全理解所有注意事项以及对这样做的分词,通配等的含义。