2015-10-17 196 views
1

我希望遍歷M行X N列值的數組並將它們打印到屏幕以供後面的腳本使用,但我在循環和NR方面遇到了問題。這是我到目前爲止有:將Bash Shell變量傳遞給Awk NR函數

#!/bin/bash 
cat temp_file | wc -l > num_rows 
i="0" 
while [ $i -le `cat num_rows` ]; do 
    echo $i 
    awk 'NR==$i{print $1, $2}' temp_file 
    awk 'NR==$i{print $3, $4}' temp_file 
    ((i++)) 
done 

正如你所看到的,我希望用先找到通過每個那些行的線路,NUM_ROWS的數量和環路,並使用AWK的NR功能要經過的每一行首先打印第一欄和第二欄,然後打印第三欄和第四欄。當上面的腳本運行時出現以下錯誤結果:

0 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
1 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
2 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
3 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
awk: illegal field $(), name "i" 
input record number 1, file temp_file 
source line number 1 
4 

依此類推,直到while循環完成。任何關於如何解決這個腳本的想法,因爲現在,設置NR == $ i不起作用。謝謝您的幫助。

+1

傳遞i到AWK無法將整個腳本用'的awk '{打印$ 3,$ 4}' temp_file'被取代? – melpomene

+0

我編輯了上面的腳本。我需要兩次調用awk,首先打印出前兩列,然後再打印第二列兩列 –

+1

不能將整個腳本替換爲'awk'{print $ 1,$ 2;打印$ 3,$ 4}'temp_file'? – melpomene

回答

4

您可以通過

awk -v i=$i 'NR==i{print $1, $2}' temp_file 

awk 'NR=='$i'{print $1, $2}' temp_file 
+0

謝謝slitvinov。這是我的問題:將一個shell變量傳遞給NR值。謝謝你的幫助。我會改變標題。 –