簡體   English   中英

AWK比較兩個單獨文件中的兩列

[英]AWK compare two columns in two seperate files

我想比較兩個文件,並做這樣的事情:如果第一個文件中的第5列等於第二個文件中的第5列,我想打印第一個文件中的整行。 那可能嗎? 我搜索了這個問題,但無法找到解決方案:(

文件由制表符分隔,我試過這樣的事情:

zcat file1.txt.gz file2.txt.gz | awk -F'\t' 'NR==FNR{a[$5];next}$5 in a {print $0}'

有沒有人試圖做類似的事情? :)

在此先感謝您的幫助!

你的腳本沒問題,但你需要將每個文件單獨提供給awk並按相反的順序。

$ cat file1.txt
a b c d 100
x y z w 200
p q r s 300
1 2 3 4 400

$ cat file2.txt
. . . . 200
. . . . 400

$ awk 'NR==FNR{a[$5];next} $5 in a {print $0}' file2.txt file1.txt
x y z w 200
1 2 3 4 400

編輯

正如評論中所指出的,上面的通用解決方案可以根據OP從壓縮的制表符分隔文件開始的情況進行改進和定制:

$ awk -F'\t' 'NR==FNR{a[$5];next} $5 in a' <(zcat file2.txt) <(zcat file1.txt)
x y z w 200
1 2 3 4 400

說明

NR是正在處理的當前記錄的編號, FNR其文件中當前記錄的編號。 因此,當awk正在處理給予它的第一個文件(在我們的例子中是file2.txt)時, NR == FNR才為真。

a[$5]將第5列的值添加為數組a的索引。 awk中的數組是關聯數組,但通常你不關心關聯一個值而只是想做一個很好的集合。 這是一個簡單的方法來收集我們在第一個文件的第5列中看到的所有值。 下面的next聲明表示立即獲取下一個可用記錄而不查看awk程序中的任何語句。

總結以上內容,這一行說“如果您正在讀取第一個文件(file2.txt),請將第5列的值保存在名為a的數組中,然后轉到記錄而不繼續使用其余的awk程序。”

NR == FNR { a[$5]; next }

希望從上面可以清楚地看出,我們可以通過awk程序第一行的唯一方法是讀取第二個文件(在我們的例子中是file1.txt)。

$5 in a評估為真,如果第五列的值發生作為在索引a數組。 換句話說,對於file1.txt中的每個記錄都是如此,我們在file2.txt的第5列中看到了第5列的值。

在awk中,當模式部分的計算結果為true時,將調用伴隨的操作。 如果沒有給出操作,如下所示,則會觸發默認操作,即只打印當前記錄。 因此,通過$5 in a$5 in a ,我們告訴awk打印file1.txt中的所有記錄,其第5列也出現在file2.txt中,這當然是給定的要求。

$5 in a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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