通过内联设置awk变量

时间:2013-02-27 22:18:01

标签: shell gawk

我有这个: ./awktest -v fields =`cat testfile`

应该将字段变量设置为'1 2 3 4 5',这就是testfile包含的所有内容

它返回: gawk:./ awktest:9:致命:无法打开文件`2'进行阅读(没有这样的文件或目录)

当我这样做时,它工作正常。 ./awktest -v fields ='1 2 3 4 5'

错误产生时的打印字段: 1 在第二个实例中打印字段产生: 1 2 3 4 5

当我用12345而不是1 2 3 4 5尝试它时,两者都可以正常工作,所以这是白色空间的问题。这是什么问题?我该如何解决呢。

2 个答案:

答案 0 :(得分:1)

这很可能不是awk问题。最有可能的是,你的 shell 是罪魁祸首。

例如,如果awktest是:

#!/bin/bash
i=1
for arg in "$@"; do
  printf "%d\t%s\n" $i "$arg"   
  ((i++))
done

然后你得到:

$ ./awktest -v fields=`cat testfile`
1   -v
2   fields=1
3   2
4   3
5   4
6   5

您会看到文件内容未作为单个字处理。

简单解决方案:在命令行中使用双引号:

$ ./awktest -v fields="$(< testfile)"
1   -v
2   fields=1 2 3 4 5

$(< file)构造是`cat file`的bash快捷方式,不需要生成外部进程。

或者,在awk BEGIN块中读取文件的第一行

awk '
    BEGIN {getline fields < "testfile"} 
    rest of awk program ...
'

答案 1 :(得分:0)

./awktest -v fields="`cat testfile`"

#note that:
#./awktest -v fields='`cat testfile`'
#does not work