3

我正在尝试比较两个文件的内容,这两个文件都只是一列数字,即

文件1:

1.2
2.6
3.4
4.7
5.3

文件2:

5.1
4.8
3.2
2.5
1.6

输出应该只是 file1 中大于 file2 中相应行的行数;所以在这种情况下,它只是

3

4

3 回答 3

8

awk 单个进程可以完成这项工作:

awk 'NR==FNR{a[NR]=$0;next}a[FNR]>$0{i++}END{print i}' file1 file2

输出:

3

编辑

通过阅读 JonathanLeffler 和 steveha 的评论,我会添加另一个解决方案,以避免将怪物文件保存到内存中。仍然是单个 awk 进程:

 awk '{getline x < "file2"}$0>x{i++}END{print i}' file1

输出:

3
于 2013-10-17T20:07:42.063 回答
5

尝试使用paste后跟awk

paste file1 file2 | awk '$1>$2 {i++} END {print i}'

输出:

3
于 2013-10-17T19:46:13.790 回答
0

这是一个仅使用 AWK 的解决方案,每次仅从每个输入文件中读取一行。

BEGIN {
    if (ARGC != 3)
    {
        print "Usage: this_program <file1> <file2>"
        exit(1)
    }

    c = 0
    for (;;)
    {
        result = getline < ARGV[1]
        if (1 != result)
            break
        n1 = $1 + 0

        result = getline < ARGV[2]
        if (1 != result)
            break
        n2 = $1 + 0
        if (n1 > n2)
            ++c;
    }
    print c
}

PS 我是 Python 的粉丝,为了好玩,我也在 Python 中解决了这个问题。

import sys

if sys.version_info.major < 3:
    import itertools
    zip = itertools.izip

with open(sys.argv[1]) as f1, open(sys.argv[2]) as f2:
    print(sum(float(x) > float(y) for x, y in zip(f1, f2)))

笔记:

  • zip()对从两个来源读取的值。 zip(f1, f2)对从两个输入文件中的每一个读取的行进行配对。

  • 当你在 Python 2.x 上运行它时,我使用了这个itertools.izip(),所以它一次只能处理一行。Python 2 中的内置zip()函数一次读取所有数据并构建一个列表。

  • 错误检查并不明显,但它就在那里。如果输入不能作为float值工作,则会出现异常;如果用户没有指定至少两个输入文件,你会得到一个异常。

  • 这使用了一个稍微低俗的技巧:sum()将布尔True值视为 1,将布尔False值视为 0。因此,这将获得>比较为真的所有行的计数。

于 2013-10-17T21:13:44.210 回答