在bash中循环文件列

时间:2015-10-01 19:37:42

标签: bash shell

我有超过70,000行和11列的行。第四列是一个位置。我想计算每一行的位置比上一行中的位置高100,并且比下一行中的位置低100。

我想在不将数据导入R的情况下这样做,所以我可以放入我的shell脚本。然而,我并不是那种经验丰富的人。

数据示例:

class Sprite {
    shared_ptr<Texture> tex;
    int x, y;
public:
    Sprite(shared_ptr<Texture> t, int x, int y) tex(t), x(x), y(y) {}

    void draw(HDC dc, int dest_x, int dest_y) { 
        BitBlt(dc, dest_x, dest_y, 32, 32, *tex, x, y, SRCCOPY);
    }
};

我想计算第3行和第6行,因为它们在第4列中的值满足了我的要求,所以我的输出应该是&#34; 2&#34;。

我试图搜索有关如何执行此操作的信息,但现在已经停留了一段时间。

2 个答案:

答案 0 :(得分:3)

要求救援!

$ awk '$4>p+100 && p>pp+100{c++} {pp=p;p=$4} END{print c}' file
2

解释

  • $4>p+100 && p>pp+100{c++}如果字段4大于prev + 100且prev大于prev prev + 100则递增计数器(以零初始值开始)

  • {pp=p;p=$4}设置新的prev prev和prev

  • 完成所有行后,
  • END{print c}打印计数器。

答案 1 :(得分:1)

你可以使用这个awk:

awk 'srec && NR==srec+1 && $4>sv+100{count++; sv=srec=0}
     frec && NR==frec+1 && $4>fv+100{fv=frec=0; sv=$4; srec=NR}
     {fv=$4; frec=NR}
     END{print count}' file

2