如果2个字段在同一行上匹配,则从同一列中减去2个值

时间:2014-05-18 05:04:13

标签: linux shell awk sed bc

我以这种方式获得了格式化文件:

1 223614 225119.537745 Engine45
2 223614 225121.082392 Engine45
3 223614 225124.440309 Engine45
4 223614 225124.763890 Engine45
5 223621 225124.933927 Engine46
6 223614 225124.934205 Engine45
7 223614 225125.354857 Engine45
8 223614 225127.603434 Engine45
.
.
.

我正在尝试创建一个awk / shell来获取1)验证第2列和第4列(如果在同一行中相等),如果适用,则2)在第2列中找到第二个找到的值,并找到第一个找到的值第1列,应该是这样的:

1)发现的第1行:

1 223614 225119.537745 Engine45

第1行发现1):

2 223614 225121.082392 Engine45

输出应该是这个的答案:

225121.082392 - 225119.537745 = 1.544647

下一个输出应为:

第3行找到1):

3 223614 225124.440309 Engine45

第4行找到1):

4 223614 225124.763890 Engine45

输出:225124.763890 - 225124.440309 = 0.323581

依次提供文件中的所有记录。

我相信1)我可以让它工作,但2)对我来说真的很难,但如果有人可以提供如何获得可能非常有用,我知道shell和awk的基础知识,如果它有帮助,但我我愿意接受像perl这样的其他工具。

此致

2 个答案:

答案 0 :(得分:0)

如果值不相等,您没有指定要执行的操作。你想跳过2行吗?或者只是其中一个并搜索匹配?

这是一个跳过这两行的Perl解决方案:

perl -e '
    while (1) {
        @first =  split " ", <>;
        @second = split " ", <>;
        print $second[2] - $first[2], "\n" if $first[1] == $second[1] and $first[3] == $second[3];
        last if eof;
    }' input-file

答案 1 :(得分:0)

如果两个连续行的值不相同,并且您想跳过这些行,则可以执行以下操作:

awk '!(NR%2) && $2==col2 && $4==col4{print $3-col3}{col2=$2;col3=$3;col4=$4}' file
1.54465
0.323581
2.24858

如果您不想跳过这些行并按原样打印第3列,那么您可以这样做:

awk '!(NR%2){print(($2==col2&&$4==col4)?$3-col3:col3 RS $3)}{col2=$2;col3=$3;col4=$4}' file
1.54465
0.323581
225124.933927
225124.934205
2.24858