2014-01-15 37 views
3

当运行在终端下面的命令,将AWK的结果到一个数组

awk /984/ $files | awk -F, '{OFS=",";print $1,$4,$17}' 

其中,

files=`ls` 

我得到这样的输出:

2013/08/18 12:51:37,11,724 
2013/08/18 12:48:02,227,84769 

我想创建一个脚本,运行该命令和以上的结果分配给这样的阵列:(单独的行作为单独的元件)

array[0] = 2013/08/18 12:51:37,11,724 
array[1] = 2013/08/18 12:48:02,227,84769 

BUT,

既不,

result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}')) 

也不,

result2=`awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'` 

满足我的目的。

如何获得像我指定的数组?

+0

你应该使用引号像这样'的awk“/串/”“$文件“并将文件的读取改为'files = $(ls)'。 result2是错误的,因为它只评估命令,需要使用外部'()'来存储数组。 – Jotne

+0

将引号添加到'$ files'可能会给出错误的结果,所以请忽略它。 – Jotne

回答

3

当你说:

result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}')) 

,产量将空白进行分割。将IFS设置为换行符,您应该看到所需的结果。说:

IFS=$'\n' result=($(awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}')) 

代替来捕获不同行输出成阵列。

+0

谢谢。改变IFS的工作! – coolscitist

0

我认为问题出在你的脚本中使用()。 我尝试了类似的例子,并得到所需的输出

myarray=(`ls *.sh`) 
for f in ${myarray[@]} 
do 
    echo $f 
done 

我想你的代码应如下

result=(`awk /string/ $files | awk -F, '{OFS=",";print $1,$4,$17}'`) 
+0

这就像他已经发布的那样''result =($(awk/string/$ files | awk -F,'{OFS =“,”; print $ 1,$ 4,$ 17}'))''应尽量避免使用旧的背部抽搐。 – Jotne

1

要存储在数组中的变量被改变,输出需要在一个形式像这样:

result=$(one two "more data") 
echo ${result[2]} 
more data 

以空格分隔的数据。所以调整你的输出来给出这种格式。

你能给你得到什么了的例子:

awk '/984/' $files | awk -F, '{OFS=",";print $1,$4,$17}' 

它可以被缩短到:

awk -F, '/984/ {OFS=",";print $1,$4,$17}' $files 
+0

缩短的命令在终端中运行良好,但是当我在脚本和回显结果中得到了=($(shortened_command))结果时,它没有给出任何结果。 – coolscitist