我正在尝试比较两个文件的内容,这两个文件都只是一列数字,即
文件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
编辑
通过阅读 JonathanLeffler 和 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。因此,这将获得>
比较为真的所有行的计数。