[英]Two file numeric comparison in 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
編輯
通過閱讀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.因此,這將獲得>
比較為真的所有行的計數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.