我正在尝试比较两个文件的内容,这两个文件只是一列数字,即
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
答案 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.这样就得到了>
比较为真的所有行的计数。