0

我有一个带有文件名列表的文本文件。我想使用 AWK 从特定的行号创建一个变量。我得到正确的输出使用:

awk "NR==\$Line" /myPath/fileList.txt

我想将此输出分配给一个变量,并且从文档中我发现我希望以下工作:

INFILE=$(awk "NR==\$Line" /myPath/fileList.txt)

或者

INFILE=`awk "NR==\$Line" /myPath/fileList.txt`

然而,

echo "\$INFILE" 

为空白。我是 bash 脚本的新手,不胜感激。

4

2 回答 2

3

AWK 命令的输出分配给变量。要查看变量的内容,请执行以下操作:

echo "$INFILE"

您应该为您的 AWK 命令使用单引号,这样您就不必转义文字美元符号(文字字符串应该被引用,如果您想替换一个 shell 变量,请参见下文):

awk 'NR == "$Line"' /myPath/fileList.txt

这种$()形式比反引号形式更受欢迎(顺便说一句,我不明白为什么你要逃避反引号)。此外,您应该习惯性地使用小写或混合大小写的变量名,以避免与 shell 或环境变量的名称冲突。

infile=$(awk 'NR == "$Line"' /myPath/fileList.txt)
echo "$infile"

如果您的意图是替换命名变量的值$Line而不是使用文字字符串“$Line”,那么您应该使用 AWK 的-v变量传递功能:

infile=$(awk -v "line=$Line" 'NR == line' /myPath/fileList.txt)
于 2012-04-16T20:58:59.913 回答
0

不要掩盖美元符号。

错误的:

 echo "\$INFILE" 

正确的:

 echo $INFILE
 echo ${INFILE}
 echo "$INFILE"
 echo "${INFILE}"

如果您想将文本粘合在一起,${x} - 构造很有用。

 echo $INFILE0

将查找变量 INFILE0。如果 $INFILE 为 5,则不会产生“50”。

 echo ${INFILE}0

如果 INFILE 为 5,这将产生 50。

如果变量包含空格和或多或少不可预测的文本,撇号很有用。

如果您的 rownumber 是一个参数:

#!/bin/bash
Line=$1
INFILE=$(awk "NR==$Line" ./demo.txt)
echo "$INFILE"

如果 INFILE 包含多个空格或制表符,则 echo $INFILE 会将它们压缩为单个空格,而 "$INFILE" 会保留它们。

于 2012-04-16T20:58:41.183 回答