首先,感谢您的帮助。我有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
输出中的空格
grep
和coreutils
也可以这样做:
grep -f letter.txt number.txt | cut -d' ' -f1 | sort | uniq -c
输出:
2 A
2 B
1 C