2014-01-15 65 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