簡體   English   中英

awk中的兩個文件數字比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM