使用AWK内部定义的变量

时间:2011-12-02 21:44:10

标签: awk

我让这段脚本正常工作。 This是我想要的:

输入

3.76023 0.783649 0.307724 8766.26   
3.76022 0.764265 0.307646 8777.46   
3.7602 0.733251 0.30752 8821.29   
3.76021 0.752635 0.307598 8783.33   
3.76023 0.79528 0.307771 8729.82   
3.76024 0.814664 0.307849 8650.2   
3.76026 0.845679 0.307978 8802.97   
3.76025 0.826293 0.307897 8690.43  

脚本

!/bin/bash 

awk -F ', ' ' 
{

    for (i=3; i<=10; i++) {
        if (i==NR) {
        npc1[i]=sprintf("%s", $1);
        npc2[i]=sprintf("%s", $2);
        npc3[i]=sprintf("%s", $3);
        npRs[i]=sprintf("%s", $4);
        print npc1[i],npc2[i],\
        npc3[i], npc4[i];
        }
    }
} ' p_walls.raw 

echo "${npc1[100]}"

但是现在我不能在awk之外使用那些数组npc1[i]。最后一个回声什么都没打印不是可能的,还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

  • AWK是一个单独的过程,在完成所有内部数据后。对于所有外部进程/命令都是如此。 Bash只能看到bash内置触摸的内容。
  • i永远不会是100,那么您为什么要访问npc1[100]
  • 你真的想做什么?如果你重写了我们可以提供帮助的问题......

答案 1 :(得分:1)

(樱桃蛋糕总是很好!)

很抱歉,但@yi_H的所有答案和评论都是正确的。

但是在awk中将2组数据加载到2个独立的数组中确实没有问题,即

awk '{
  if (FILENAME == "file1") arr1[i++]=$0 ; 
  #same for file2; } 
 END {
      f1max=++i; f2max=++j;
      for (i=1;i<f1max;i++) {
        arr1[i] 
        # put what you need here for arr1 processing 
        #
        # dont forget that you can do things like
        if (arr1[i] in arr2) { print arr1[i]"=arr2[arr1["i"]=" arr2[arr1[i]] }
      }
      for j=1;j<f2max;j++) {
        arr2[j] 
        # and here for arr2
      }
 }' file1 file2 

你必须填写arr1 [i]和arr2 [j]的实际处理。

另外,请在周末获取一本awk书,并在周一之前启动并运行。这很简单。您可以从grymoire.com/Unix/awk.html

中找到它

我希望这会有所帮助。