簡體   English   中英

使用AWK比較每個具有單列的兩個文件,並對每個匹配項進行計數

[英]Using AWK compare two files having single columns in each and get count againts each matched item

我將把我的問題分成兩個問題

問題1

我有兩個數字排序的文件,如下所示。 文件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

問題2

我將在大文件上運行它。 實際目標文件的行數低於行數:

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.

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