0

我有一个这样的格式化文件:

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)用第一个找到的列 1 减去第 2 列上的第二个找到的值,应该是这样的:

1) 找到的第一行:

1 223614 225119.537745 Engine45

1) 找到的第 2 行:

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 等其他工具上完成。

问候

4

2 回答 2

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
于 2014-05-18T05:15:06.443 回答
0

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

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

如果您不想跳过这些行并按原样打印第三列,那么您可以执行以下操作:

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
于 2014-05-18T06:12:08.463 回答