Bash:找到所有线对,使得它们的第一个字段的差异小于阈值

时间:2016-11-03 15:16:00

标签: bash command-line lines difference

我的问题如下。我有一个包含许多行的BIG文件,其中包含有序数字(可以重复)

1
1.5
3
3.5
6
6
...
1504054
1504056

我想打印所有行号,使得它们的差异小于给定的阈值thr。让我们说例如thr = 2.01,我想要

0 1
0 2
1 2
1 3
2 3
4 5
...
N-1 N

我在python中写了一个东西,但文件很大,我想我需要一个聪明的方法来在bash中执行此操作。 实际上,在完整的数据结构中,还存在包含字符串的第二列:

1 s0
1.5 s1
3 s2
3.5 s3
6 s4
6 s5
...
1504054 sN-1
1504056 sN

并且,如果容易做的话,我想在每一行写一对链接的字符串,可能用“|”分隔:

s0|s1
s0|s2
s1|s2
s1|s3
s2|s3
s4|s5
...
sN-1|sN

感谢您的帮助,我对bash不太熟悉

1 个答案:

答案 0 :(得分:1)

在任何语言中,您都可以实现此伪代码的程序:

while read line:
    row = line.split(sep)
    new_kept_rows = []
    for kr in kept_rows :
      if abs(kr[0], row[0])<=thr:
         print "".join(kr[1:]) "|" "".join(row[1:])
         new_kept_rows.append(kr)
    kept_rows = new_kept_rows

这个程序只保留几条可以匹配条件的行。所有其他人都没有记忆。因此,即使是大文件,内存占用也应该很小。

我会使用awk语言因为我很舒服。但是python也适合(我给的伪代码非常接近python)。