【问题标题】:Substract 2 values from same column if 2 fields match on same line如果 2 个字段在同一行上匹配,则从同一列中减去 2 个值
【发布时间】:2014-05-18 05:04:13
【问题描述】:

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

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 223614 225119.537745 Engine45

1) 找到的第 2 行:

2 223614 225121.082392 Engine45

输出应该是这个的答案:

225121.082392 - 225119.537745 = 1.544647

下一个输出应该是:

第 3 行按 1):

3 223614 225124.440309 Engine45

4th line find by 1):

4 223614 225124.763890 Engine45

输出:225124.763890 - 225124.440309 = 0.323581

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

我相信 1) 我可以让它工作,但 2) 对我来说真的越来越难了,但如果有人可以指导如何获得可能会非常有用,如果有帮助,我知道 shell 和 awk 的基础知识,但我我愿意在 perl 等其他工具上完成工作。

问候

【问题讨论】:

  • 你希望输出在哪个地方?
  • 1) 验证第 2 列和第 4 列是否在同一行中相等 但是只有三列可用。
  • 如果值不一样怎么办?例如。第 5 行末尾有 6
  • 你应该提供你的预期输出来澄清。
  • 输出可以打印在屏幕上,列用空格分隔,并且在提供的文件中,每行总是相等的,但是这个相等的行可能就在下一个或可能在最后一行,因此脚本应在文件中搜索第 2 列和第 4 列相等的第一个匹配项并进行逻辑。

标签: linux shell awk sed bc


【解决方案1】:

如果连续两行的值不同,你想跳过这些行,那么你可以这样做:

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

【讨论】:

    【解决方案2】:

    如果值不相等,您没有指定该怎么做。你想跳过这 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
    

    【讨论】:

    • 可能是搜索匹配项的类似脚本吗?
    • @cdjve:几乎任何事情都可以。这取决于你知道什么以及你有多少时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多