我有一个包含文件名列表的文本文件。我想使用AWK从特定的行号创建一个变量。我使用以下方法获得正确的输出:
awk "NR==\$Line" /myPath/fileList.txt
我想将此输出分配给变量,并且从我发现的文档中我希望以下内容能够正常工作:
INFILE=$(awk "NR==\$Line" /myPath/fileList.txt)
或
INFILE=`awk "NR==\$Line" /myPath/fileList.txt`
然而,
echo "\$INFILE"
是空白的。我是bash脚本的新手,我会很感激任何指针。
答案 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”会保留它们。