使用AWK计算将一个文件与另一个文件匹配的元素数



首先,感谢您的帮助。我有letter.txt文件:

A
B
C

我有文件号.txt

B  10
D  20
A  15
C  18
E  23
A  12
B  14

我想计算letter.txt中的每个字母在number.txt中出现了多少次,所以输出将是:

We have found 2 A
We have found 2 B
We have found 1 C
Total letter found: 5

我知道我可以用这个代码来做,但我想用任何文件来做。

cat number.txt | awk 'BEGIN {A=0;B=0;C=0;count=0}; {count++};{if ($1 == "A")A++};{if ($1 == "B")B++};{if ($1 == "C")C++}END{print "We have found" A "An" "We have found" B "Bn" "We have found" C "C"}

您基本上想要进行内部联接(很容易在谷歌上搜索(,并通过联接键分组,并返回每个组的计数。

awk 'NR==FNR { count[$1] = 0; next }
$1 in count { ++count[$1]; ++total}
END { for(k in count)
print "We have found", count[k], k
print "Total", total, "letters"}' letters.txt numbers.txt

所有这些都应该很容易在基本的Awk教程中找到,但简而言之,当您读取第一个输入文件时,文件FNR中的行号等于总行号NR。我们初始化count以包含我们想要查找的密钥。如果我们失败了,我们正在读取第二个文件;如果我们看到一个我们想要的密钥,我们会增加它的计数。完成后,报告我们的发现。

考虑以开头

$ join letter.txt <(cut -d' ' -f1 number.txt | sort) | uniq -c
2 A
2 B
1 C

然后:

$ join letter.txt <(cut -d' ' -f1 number.txt | sort) | uniq -c |
awk '
{ print "We have found", $1, $2; tot+=$1 }
END { print "Total letter found:", tot+0 }
'
We have found 2 A
We have found 2 B
We have found 1 C
Total letter found: 5

尽管在现实中,我可能只是在awk中完成这一切,只是想展示一个替代方案。

不知道是否需要awk对我来说,使用grep-c 更容易(但执行速度较慢,正如您在评论中所读到的(

cat file1 | while read line; do 
c=`grep -c $line file2 | sed 's/ //g'`; 
echo We have found $c $line; 
done

这是一个循环$c是grep -c的计数,sed移除grep -c输出中的空格

grepcoreutils也可以这样做:

grep -f letter.txt number.txt | cut -d' ' -f1 | sort | uniq -c

输出:

2 A
2 B
1 C

相关内容

最新更新