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

使用AWK计算一个文件与另一个文件匹配的元素数,awk,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

首先,谢谢你的帮助。我有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 "A\n" "We have found" B "B\n" "We have found" C "C"}

基本上,您希望通过join键进行足够简单的内部连接,并通过google和group返回每个组的计数

awk'NR==FNR{count[$1]=0;next} 计数中的$1{++count[$1];++total} 结束{fork in count 我们找到的指纹,计数[k],k 打印总计、总计、字母数}'letters.txt numbers.txt
所有这些都应该在基本的Awk教程中很容易找到,但简而言之,当您读取第一个输入文件时,文件FNR中的行号等于总行号NR。我们初始化count以包含要查找的键。如果我们失败了,我们正在阅读第二个文件;如果我们看到想要的密钥,我们会增加其计数。完成后,报告我们发现的内容。

您基本上希望通过join键进行足够简单的内部连接,并返回每个组的计数

awk'NR==FNR{count[$1]=0;next} 计数中的$1{++count[$1];++total} 结束{fork in count 我们找到的指纹,计数[k],k 打印总计、总计、字母数}'letters.txt numbers.txt 所有这些都应该在基本的Awk教程中很容易找到,但简而言之,当您读取第一个输入文件时,文件FNR中的行号等于总行号NR。我们初始化count以包含要查找的键。如果我们失败了,我们正在阅读第二个文件;如果我们看到想要的密钥,我们会增加其计数。完成后,报告我们的发现。

不知道您是否需要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 remove spaces在grep-c输出中不知道是否需要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 remove spaces在grep-c输出中

grep和coreutils也可以这样做:

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

2A 2 B 1 C grep和coreutils也可以这样做:

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

2A 2 B 1 C
考虑从以下方面开始:

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


虽然实际上我可能只是在awk中完成这一切,但我只是想展示一个替代方案。

考虑从以下方面开始:

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


虽然事实上我可能只是在awk中完成这一切,但我只是想展示一个替代方案。

非常感谢,但我如何计算找到的全部信件@刚才更新了三次;同样,不难看出你是否花了30分钟在一个基本的Awk介绍上。非常感谢你,但是我如何计算找到的信的总数@刚才更新了三次;同样,如果你花30分钟做一个基本的Awk介绍,也不难理解。这将是非常低效的。除此之外,您还想解决如何更快地编写它的问题,您的意思是引用“,”或?您通常希望在所有shell变量周围使用双引号,除非您特别要求shell对值执行空格标记化和通配符扩展。点击链接查看详情;这就是我提供它的原因。您正在一次又一次地在一个可能很大的文件上运行grep。我提供的Awk解决方案在目标文件上一次完成所有搜索。这是一个常见的常见问题。引用错误非常常见,即使在表面上是专业开发人员编写的生产脚本中也是如此。你最好花点时间来理解它是如何工作的;但是,如果您不能或不想,可以为许多常见的shell脚本错误提供简单的修复。这将是非常低效的。除此之外,您还想解决如何更快地编写它的问题,您的意思是引用“,”或?您通常希望在所有shell变量周围使用双引号,除非您特别要求shell对值执行空格标记化和通配符扩展。点击链接查看详情;这就是我提供它的原因。您正在一次又一次地在一个可能很大的文件上运行grep。我提供的Awk解决方案在目标文件上一次完成所有搜索。这是一个常见的常见问题。引用错误非常常见,即使在表面上是专业开发人员编写的生产脚本中也是如此。你最好花点时间来理解它是如何工作的;但是,如果您不能或不想,可以为许多常见的shell脚本错误提供简单的修复。这可以在行中的任何位置找到字母,而不仅仅是第一个字段。例如,如果其他字段均为数字且键始终为字母,则可以;但如果不是,就很难适应。@tripleee:根据OP,第一个字段中只有字母。这会在行中的任何位置找到字母,而不仅仅是第一个字段。如果其他字段都为nu,则可以
例如,meric和键总是字母;但如果不是,就很难适应。@tripleee:根据OP,第一个字段中只有字母