[英]Using AWK compare two files having single columns in each and get count againts each matched item
我將把我的問題分成兩個問題
我有兩個數字排序的文件,如下所示。 文件t1.txt具有唯一值。 文件t2.txt具有重復值。
file1:t1.txt
1
2
3
4
5
file2:t2.txt 0 2 2 3 4 7 8 9 9
我需要的輸出如下:item matching --->在t2.txt中匹配的次數
用awk我用的是:
awk 'FNR==NR {a[$1]; next} $1 in a' t2.txt t1.txt
我得到的輸出是:
2
3
4
但是我想要這個:
2 --> 2
3 --> 1
4 --> 1
我將在大文件上運行它。 實際目標文件的行數低於行數:
t1.txt 9702304
t2.txt 32412065
隨着文件大小的增加,我們如何提高腳本/解決方案的性能。 請考慮兩個文件只有一列,並按數字排序。
將在此感謝您的幫助。 謝謝!
如果您不需要使用awk,那么這個管道可以幫助您完成大部分工作:
$ grep -Fxf t1.txt t2.txt | sort | uniq -c
2 2
1 3
1 4
$ join <(sort t1.txt) <(sort t2.txt) | uniq -c | awk '{ print $2 " --> " $1}'
2 --> 2
3 --> 1
4 --> 1
(當然,如果文件確實已經排序,你可以跳過排序,雖然我在你的樣本數據中注意到0
跟隨9
)
對於你的問題1,這個單線應該有幫助。
awk 'NR==FNR{a[$1];next}$1 in a{b[$1]++}END{for(x in b)printf "%s --> %s\n", x, b[x]}' f1 f2
用您的數據測試:
kent$ head f*
==> f1 <==
1
2
3
4
5
==> f2 <==
2
3
4
2
7
8
9
9
0
kent$ awk 'NR==FNR{a[$1];next}$1 in a{b[$1]++}END{for(x in b)printf "%s --> %s\n", x, b[x]}' f1 f2
2 --> 2
3 --> 1
4 --> 1
對於問題2,您可以在文件上測試這個單線程,看看性能是否正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.