2012-04-16 86 views
0

我有一个带有文件名列表的文本文件。我想使用AWK从特定的行号创建一个变量。使用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

这两个命令都不提供任何输出,它们设置变量INFILE。 (第一个版本是“更好”。) – Mat 2012-04-16 20:30:34

+0

对不起,我应该澄清。回声“\ $ INFILE”是空白的。 – Sara 2012-04-16 20:50:10

+0

如果您逃避美元符号,则不会展开INFILE变量。改用'echo“$ INFILE”'来代替。 – ghoti 2012-04-17 01:27:28

回答

0

不要掩盖美元符号。

错误:

echo "\$INFILE" 

权:

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

的$ {X} - 结构是有用的,如果你喜欢胶水文本一起。

echo $INFILE0 

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

echo ${INFILE}0 

这将产生50,如果INFILE是5

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

如果您ROWNUMBER是一个参数:

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

如果INFILE包含多个空格或制表符,回声$ INFILE将他们凝聚到单个空格,而“$ INFILE”保留他们。

+1

不,这不会产生INFILE十次。它会在后面产生一个“0”的INFILE。在这种情况下,花括号不用于参数扩展和支撑扩展 - 只有前者。你可以做'INFILE = foo; echo“$ {INFILE}”{0..9}'这会输出'foo0 foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9'。顺便说一句,你应该总是*引用输出变量。这些不是撇号(单引号),它们是双引号。 – 2012-04-16 21:26:10

+0

我可以通过硬编码行号得到这个工作:infile = $(awk“NR == 1”/myPath/fileList.txt)。但我只能看到使用echo \ $ infile的值。 echo $ infile是空白的。我仍在努力理解这是为什么。 – Sara 2012-04-16 22:31:02

+0

@ DennisWilliamson:如果INFILE是7,它会产生70,这就是我的意思。但是,我的第一印象是,一行的内容是一个数字,是错误的,尽管我最终意识到这一点,但在写作时我被打断了,忘记调整第一个例子。我不同意“你应该永远......” - 这是货物崇拜节目。 – 2012-04-17 01:05:21

3

将AWK命令的输出分配给变量。要查看变量的内容,这样做:

echo "$INFILE" 

你应该用你的AWK命令单引号,这样你就不必逃避文字美元符号(文字字符串应该被引用,请参见下面如果要替换一个shell变量来代替):

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

$()之上,反引号形式,但最好(我不明白为什么你有反引号逃脱,顺便说一句)。此外,您应该习惯性地使用小写或混合大小写变量名称,以避免与shell或环境变量发生名称冲突。

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

如果你的目的是,一个名为$Line变量的值应该被替换,而不是文本字符串“$线”被使用,那么你应该使用AWK的-v变量传递功能:

infile=$(awk -v "line=$Line" 'NR == line' /myPath/fileList.txt) 
+0

$ line变量是由我的作业调度程序SGE设置的环境变量。我相信我需要在提交脚本中转义变量名称。我尝试了infile = $(awk -v“line = $ SGE_TASK_ID”'NR == line'/myPath/fileList.txt),但是从echo $ infile得到了相同的结果。 – Sara 2012-04-16 22:00:43

+0

@Sara:那么可能我最后一个例子就是要走的路。然后你可以'echo'$ infile“'或者用其他方式使用变量,当然。 – 2012-04-16 22:02:52

+0

谢谢,你的例子有道理,看起来应该可以工作,但在跟踪它之后,我仍然从echo“$ infile”获得相同的空白结果。 – Sara 2012-04-16 22:41:01