awk中的两个文件数字比较

时间:2013-10-17 19:39:15

标签: linux awk

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

File1中:

  

1.2
  2.6
  3.4
  4.7
  5.3

文件2:

  

5.1
  4.8
  3.2
  2.5
  1.6

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

  

3

3 个答案:

答案 0 :(得分:8)

单个进程可以做到这一点:

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

答案 1 :(得分:5)

尝试使用paste后跟awk

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

输出:

3

答案 2 :(得分: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
}

P.S。我是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.这样就得到了>比较为真的所有行的计数。