我试图比较两个文件的内容,这两个文件都只是一列数字,即
文件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.因此,这将得到>
比较是真的所有行的计数。