awk中的两个文件数字比较

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

文件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

awk单个进程可以做那个工作:

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

输出:

 3 

编辑

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

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

输出:

 3 

尝试使用paste之后awk

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

输出:

 3 

这是一个只使用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.因此,这将得到>比较是真的所有行的计数。