使用AWK从文件中读取行并创建变量

时间:2012-04-16 20:26:55

标签: bash awk sungridengine command-substitution

我有一个包含文件名列表的文本文件。我想使用AWK从特定的行号创建一个变量。我使用以下方法获得正确的输出:

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

我想将此输出分配给变量,并且从我发现的文档中我希望以下内容能够正常工作:

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

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

然而,

echo "\$INFILE" 

是空白的。我是bash脚本的新手,我会很感激任何指针。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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”会保留它们。