2015-10-17 98 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值。谢谢你的帮助。我会改变标题。 –