逐行匹配两个文件?

逐行匹配两个文件?

我有两个由数字组成的文件。现在,我想将第一个文件的行与第二个文件的所有行匹配,并在找到匹配时增加计数器。如何为此编写 bash 脚本?

file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3

答案1

假设file1.txtfile2.txt有一组这样的数字:

file1.txt:

1
2
4
6
7

file2.txt:

2
6
7
8
9

您可以尝试几种方法,具体取决于您想要如何处理数据或者您想要在此过程中收集什么。

  • Grep 可以在文件中搜索模式字符串。可以使用该标志使用另一个文件来提供模式-f。该-x标志还确保您只找到整行匹配,以便模式“2”与“24”不匹配。最后,-c标志会计算匹配的数量。把它们放在一起你会得到:

    grep -x -c -f file1.txt file2.txt
    
  • 如果您想对一路上的数字执行其他操作以获取总数,您可以采取更手动的方法:

    counter=0
    while read number; do
        grep -q -x "$number" file2.txt && let counter=$counter+1
    done < file1.txt
    echo $counter
    

    当您为 file1.txt 中的每一行再次读取 file2.txt 时,效率要低得多,但如果您还想对数字执行其他操作或沿途操作文件,则更容易修补到像这样的循环那。不使用该-q标志,因此 grep 是静默的,仅返回退出代码。使用该代码,我们可以判断是否找到匹配项,并且仅在找到匹配项时才增加计数器。

无论您采用哪种方式,请确保考虑到某些行与作为其他数字的子字符串的数字部分匹配的可能性。此外,您还需要考虑如果每行有多个匹配项,您希望发生什么。每次重复都会增加计数器还是只发生一次。请注意,上面的两个选项对此的处理方式不同!对于某些数据集,他们会给出不同的结果。如果您希望他们给出相同的结果,则可以采用两种技术。例如,第一个可以检查删除了所有重复项的文件版本,因此没有任何内容会匹配多次:

 grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)

相关内容