bash - 如何在 bash 中成对减去字段?

标签 bash unix awk

我有一个大型数据集,如下所示:

5 6 5 6 3 5
2 5 3 7 1 6
4 8 1 8 6 9
1 5 2 9 4 5

对于每一行,我想从第二个字段中减去第一个字段,从第四个字段中减去第三个字段,依此类推,以加深字段数(总是偶数)。然后,我想报告那些与所有对的差异超过特定限制(比如 2)的行。我还应该能够报告下一个最佳行,即其中一对比较未能满足限制但所有其他对都满足限制的行。

在上面的例子中,如果我将限制设置为 2,那么我的输出文件应该包含 最佳台词:

2 5 3 7 1 6    # because (5-2), (7-3), (6-1) are all > 2
4 8 1 8 6 9    # because (8-4), (8-1), (9-6) are all > 2 

下一个最佳行

1 5 2 9 4 5    # because except (5-4), both (5-1) and (9-2) are > 2

我目前的做法是读取每一行,将每个字段保存为一个变量,做减法。 但我不知道如何进一步进行。

谢谢,

最佳答案

将“最佳”行打印到文件“best”,并将“次佳”行打印到文件“nextbest”

awk '
{
        fail_count=0
        for (i=1; i<NF; i+=2){
                if ( ($(i+1) - $i) <= threshold )
                        fail_count++
        }
        if (fail_count == 0)
                print $0 > "best"
        else if (fail_count == 1)
                print $0 > "nextbest"
}
' threshold=2 inputfile

非常简单的东西。

  1. 一次循环遍历 2 个字段。
  2. 如果(下一个字段 - 当前字段)不超过threshold,增加fail_count
  3. 如果该行的fail_count 为零,则意味着它属于“最佳”行。

    否则,如果该行的 fail_count 为 1,则它属于“下一个最佳”行。

关于bash - 如何在 bash 中成对减去字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312772/

相关文章:

bash - 如何使用 Ctrl+C 停止整个脚本而不仅仅是当前命令

bash - 通过 readreg 和粘贴将输入发送到分离的 'screen' 时出现问题

c - 使用 -D 引用宏预处理器

java - 如何在 Java 中创建 API 来更改 Unix 用户的密码?

perl - 在 perl 中重新格式化文本

linux - 如何根据文件B中的行号替换文件A中的某些行

bash - awk 循环覆盖文件

javascript - 使用 bash 脚本修改 javascript 文件

c++ - 打开目录中的文件夹

C:如何解析 "|"