我有一个大型数据集,如下所示:
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
非常简单的东西。
- 一次循环遍历 2 个字段。
- 如果(下一个字段 - 当前字段)不超过
threshold
,增加fail_count
如果该行的
fail_count
为零,则意味着它属于“最佳”行。否则,如果该行的
fail_count
为 1,则它属于“下一个最佳”行。
关于bash - 如何在 bash 中成对减去字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13312772/