我有一个名为“random”的文件,如下所示:
A B C D
A B C D
A B C D
如何让这个 shell 脚本打印第二列?
#! /usr/bin/tcsh -f
set variable = "2"
awk '{print "$""'"$variable"'" }' random
它给:
$2
$2
$2
$2
$2
如果我像这样对 $2 进行硬编码:
#! /usr/bin/tcsh -f
awk '{print $2 }' random
我明白了
B
B
B
但是我每次都需要设置不同的值,所以硬编码不是一种选择
使用 awk 的
-v
选项将变量传递给 awk。例如,将 awk 变量设置n
为与 csh 变量相同的值$variable
:或者,在脚本之后将变量赋值作为参数传递(awk 会将参数解释
x=y
为赋值,而不是文件名):在这两种情况下,awk 脚本都将解释
$n
为“编号为 n 的字段”或者,您可以使用环境变量。awk 可以通过
ENVIRON
数组访问它们。例如顺便说一句,正如其他人在评论中提到的那样,
csh
/tcsh
不是脚本语言的好选择 - 使用类似 bourne 的 shell 来编写 shell 脚本。tcsh
对于交互式 shell 来说仍然是不错的,但没有提供其他 shell 尚未提供的任何东西 - csh 在 1980 年代是一个优秀的交互式 shell,但其他 shell 早已超越它(而 csh 有缺点与良好的脚本外壳语言不同,因此您不会仅通过交互式使用脚本来获得脚本经验)。尝试改用 bash、ksh 或 zsh。并不是说我记得 (t)csh 的所有怪癖,但我认为这与它在类似 POSIX 的 shell 中的工作方式类似。你有一个带引号的 string
'{print "$""'
,包括双引号;然后是引用的变量扩展"$variable"
;然后是另一个带引号的字符串'" }'
。awk 得到的是{print "$""2" }
,有两个背靠背的 awk 字符串,它们 awk 连接起来。但它们是字符串,而不是$
运算符。去掉多余的双引号:
或在 POSIX-y shell 中: